1. 程式人生 > >Spring總結及不同版本間的區別

Spring總結及不同版本間的區別

一 Spring中有一個IOC物件容器(Spring內部的一個HashMap容器),用於盛放物件的!

Spring中全部生成的物件都放在IOC物件容器中的!是以name或id的值做鍵存在容器中的!

給物件注入值的方式:---以下的4種全部都是交給Spring框架去注入的!

1.       用不帶引數的構造子依賴注入

2.       Set依賴注入

3.       帶引數的構造子依賴注入

4.       介面依賴注入

5.       LookUp-Method(使用CGLIB的動態位元組碼增強功能)注入,重寫方法!

<ref bean="p3"/>---表示可以引用其他Xml中的Bean;

<ref local="a"/>---local表示只能引用本Xml中的Bean;

Spring中載入上下文的三種方式:

ApplicationContext act=new ClassPathXmlApplicationContext(“applicationContext.xml”);

Resource resource=new ClassPathResource("application.xml");

ApplicationContext  act =  new  FileSystemXmlApplicationContext (“F:/絕對路徑/application.xml”) ;

二 Spring配置工廠Bean

呼叫getBean(“工廠bean的id”)方法,Spring返回的不是直接建立的工廠Bean的例項,而是由工廠Bean建立的Bean例項(工廠bean生產的產品例項).

三 Spring的IOC容器用於管理Struts和Hibernate

 SessionFactory和事務都是Hibernate中的東西,而不是Spring 的,Spring只是進行了封裝,本質上是Hibernate的,Spring通過SpringORM封裝了Hibernate!

注意:在使用Spring的時候,由Hibernate生成的影射檔案中要取消指定的資料庫名,否則查詢資料庫是要報錯!

----------整合部分!

四 Stirng1.2+Spring1.2+Hibernate3.1的整合(重點)

1.        Struts1.2的配置檔案: Struts-config.xml檔案都是自動生成的!

  <action-mappings >

    <action

      attribute="userForm"  

      parameter="m"

      path="/user"

      name="userForm"

      type="org.springframework.web.struts.DelegatingActionProxy"—不同點就在這裡,不是Action的包路徑了,而是使用Spring的代理類交給Spring去建立Action的事例!讓它享受Spring的服務

      validate="false">

      <forward name="user" path="/user.jsp"></forward>

     </action>

</action-mappings>

  <message-resources parameter="org.tongying.www.ApplicationResources" />

</struts-config>

2.  Spring的配置檔案 ApplicationContext.xml檔案標頭檔案自動生成

<beans>

<!--session工廠-->

使用的事務和事務的管理都是用的Hibernate裡面的東西,都在Spring的.orm.hibernate3的下面

<bean id="sf" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

     <property name="configLocation">

     <value>classpath:hibernate.cfg.xml</value>

     </property>

</bean>

<!--事務管理-->

<bean id="tm" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory" ref="sf"></property>

</bean>

配置的繼承

下面的配置可以使用配置繼承的方法來減少Spring的配置氾濫

先寫個基礎的代理,不指定target的代理目標,並且告訴Spring是抽象的不能使用,abstract=”true”!

當建對於具體的目標的Bean的時候,繼承上面的基礎代理就可以了!parent=”baseProxy”

再把target指定代理目標!

<!--servicei代理-->這就是代理,可以在其中加工處理的!

用事務攔截機的代理工廠Bean,針對業務層進行事務的監控--

<bean id="basePoxy"  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

    <property name="transactionManager" ref="transactionManager"></property>

       <property name="transactionAttributes">

        <props>

            <prop key="insert*">PROPAGATION_REQUIRED</prop>

            <prop key="delete*">PROPAGATION_REQUIRED</prop>

            <prop key="update*">PROPAGATION_REQUIRED</prop>

            <prop key="save*">PROPAGATION_REQUIRED</prop>

            <prop key="merge*">PROPAGATION_REQUIRED</prop>

            根據不同的動作而執行事務!   

            <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>

        </props>

    </property>

</bean>

針對業務層進行事務的監控

<bean id="userserviceproxy"  parent="baseproxy">

    <property name="target" ref="userservicei"></property>     

</bean>

<!--daoimpl-->要使用SessionFactory查詢持久層!

<bean id="userdaoi" class="org.wllt.www.daoi.UserDaoi">

  <property name="sessionFactory" ref="sf"></property>

</bean>

<!--serviceimpl-->要使用Dao介面的資料

<bean id="userservicei" class="org.wllt.www.servicei.UserServicei">

  <property name="dao" ref="userdaoi"></property>

</bean>

<!--Action-->要使用業務層的資料

<bean name="/user" class="org.wllt.www.action.UserAction" singleton=”true”>--預設就是true

  <property name="userservice" ref="userservicePoxy"></property>

但是不能直接來自於Servicei,因為在業務層需要事務,資料庫才會生效!只有先用代理處理!

</bean>

</beans>

3.Web.xml檔案

Struts1.2的配置檔案自己會載入的,但是Spring則要我們自己來寫配置!

---上下文的載入Spring的配置檔案!

<context-param>     

 <param-name>contextConfigLocation</param-name>

       <param-value>classpath:applicationContext.xml</param-value>

 </context-param>

---Spring載入監聽器

   <listener>     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

注意:在整合的過程中,Spring的jar包和Hibernate的jar包有許多的衝突,我們的處理方法是把Hibernate的相容性先新增到專案中,讓它可以幫我們產生配置檔案和po影射檔案,再移出全部的jar 包,把Hibernate的一個.jta拷到專案中就夠使用了!。在和Struts2.0的整合過程中也是如此!(只不過還有一個Struts2到Spring的外掛.jar)

兩個.jar包都是倒到專案的WebRoot下的Web-Inf下的lib下就可以了!

Struts1.2和Struts2.0配合Spring1.2時的區別:

(1)1.2在Struts-config.xml中使用代理類來來把Action的事例交給Spring的

org.springframework.web.struts.DelegatingActionProxy

     2.0中是在Actions.xml中使用class=”Action在Spring 中的id名”

 (2)1.2在Application中定義Action是使用的name=”/useraction”

2.0 -------------------------------  id=”useraction”  

 (3)2.0在struts.xml中使用了<constant name="struts.objectFactory" value="spring"/>

(4)web.xml都是一樣的!

五.Struts2.0+Spring1.2+Hibernate3.1的整合!

1.自己建actions.xml檔案

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

    "struts-2.0.dtd">  

 <struts>

    <package name="one" namespace="/one" extends="struts-default">

    <!--利用class="useraction"到Spring容器中去找生成的物件-->

    <action name="user" method="list" class="useraction">-原來是action的包路徑,Spring整合不同

     <result name="user">/user.jsp</result>

        </action>     

    </package>

 </struts>

2.自己建struts.xml檔案

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

    "struts-2.0.dtd">

    <struts>

      <constant name="struts.devMode" value="true" />

      <constant name="struts.locale" value="zh_CN" /> 

      <constant name="struts.i18n.encoding" value="GBK" />

      <constant name="struts.action.extension" value="action,itfuture,do"/>

      <!--利用Struts2到Spring的外掛把Struts和Spring聯絡起來 -->[不用也可以]

      <constant name="struts.objectFactory" value="spring"/>

      <!--載入了action.xml-->

      <include  file="actions.xml"/>

</struts>

3.Spring中的applicationContext.xml檔案

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<!--SessionFactory-->

   <bean id="sf" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

       <property name="configLocation">

       <value>classpath:hibernate.cfg.xml</value>

       </property>

   </bean>

<!--事務的管理-->

   <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

        <property name="sessionFactory" ref="sf"></property>

   </bean> 

<!--serviceiproxy用事務攔截機的代理工廠Bean,針對業務層進行事務的監控,可以先做成代理的一個模版(其他的地方引用即可!)-->

<bean id="baseproxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

     <property name="transactionManager" ref="transactionManager"></property>

     //去掉--<property name="target" ref="servicei"></property>--//

     <property name="transactionAttributes">

         <props>  

            <prop key="save*">PROPAGATION_REQUIRED</prop>

            <prop key="delete*">PROPAGATION_REQUIRED</prop>

            <prop key="update*">PROPAGATION_REQUIRED</prop>   

            <prop key="insert*">PROPAGATION_REQUIRED</prop>

            <prop key="merge*">PROPAGATION_REQUIRED</prop>

            <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>

         </props>

     </property>

</bean>

此處引用定義代理(都可以適用的,部分什麼版本的配合!)

<bean id="deptserviceiproxy" parent="baseproxy">

    <property name="target" ref="deptservicei"></property>

</bean>

<!--daoimpl-->   

<bean id="daoi" class="org.wllt.www.daoi.UserDaoi">

  <property name="sessionFactory" ref="sf"></property>

</bean>

<!--serviceimpl-->

    <bean id="servicei" class="org.wllt.www.servicei.UserServicei">

        <property name="dao" ref="daoi"></property>

</bean>

<!--action-->

    <bean id="useraction" class="org.wllt.www.action.UserAction" singleton=”true”>

    <property name="service" ref="serviceproxy"></property>

    </bean>   

</beans>

LookUp(利用CGLIB增強技術完成)

<lookup-method name=”方法名” bean=”返回型別”>

六.Spring2.0的使用!

(Struts2.0+Spring2.0+Hibernate3.1)

1.       Spring2.0完全向下相容Spring1.2,程式碼不經過改動就可以執行專案!

2.       Spring1.2和Spring2.0的區別在哪裡?

區別就是在applicationContext.xml的檔案中!(在.jar包裡有)

a.標頭檔案不同1.2是.dtd規則,而2.0是.xsd規則

b.下面的<action>配置單態性不同!

<!--action-->

  <!--spring2.0用scope="singleton/prototype"替代spring1.2中的singleton="true/false"-->

  <bean id="deptAction" class="org.itfuture.www.actions.DeptAction" scope="prototype">

     <property name="service" ref="deptserviceiproxy"></property>

  </bean>