1, Spring bean 定義
spring bean 定義可能包含大量的配置信息,包括容器相關的信息(比如初始化方法,靜態工廠方法
等)、構造函數參數、屬性等。如果兩個bean之間的配置信息大同小異,可采用bean的繼承來減少重
復配置工作。子bean定義可以從父bean定義繼承部分配置。它也可覆蓋一些配置,或者添加一些配置
。使用繼承配置可以節省很多輸入工作,實際上就是一種模板形式。
spring中事務配置中就有這樣例子,為了使用事務只要父配置了事務代理就可以了,所有需要事務的
bean只要繼承父就可以了。說到這個就在多說幾句,父bean通常不需要實例化的,而僅僅作為子bean
定的的模板使用;而ApplicationContext默認預初始化所有的singleton bean。為了阻止父bean被預
初始化,可以使用abstract屬性設置父bean為抽象bean。容器會忽略所有的抽象bean定義,預初始化
時不初始化抽象bean。
2, spring 事務管理
傳統的J2EE開發者對事務管理可能采用兩種策略
(1),全局事務:全局事務通常由應用服務器管理,使用JTA。全局事務可跨越多個事務性的資源,保證
在多個事務性資源間跨越時資源一致性。
(2),局部事務:局部事務和特定資源相關,如,一個和JDBC鏈接關聯的事務。該事務盡能保證對該
JDBC連接數據庫的一致性,對局部事務,應用服務器不需要參與事務管理,不能保證跨越多個資源的
事務正確性。
3,編程式事務
Spring 提供兩種編程式的事務管理
(1)使用TransactionTemplate事務管理
(2)直接使用一個PlatformTransactionManager實現類管理事務。
兩種編程式的事務都不需要與特定的事務API耦合,第一種更符合Spring模板式的編程模型,因此通常推薦采用第一種方式,第二種非常類似于JTA的UserTransaction的API編程,區別是減少了異常處理。
4,聲明式事務
Spring的聲明式事務是通過面向切面(AOP)實現。
(1)使用聲明式事務管理
通常,通過TransactionPoxyFactoryBean為目標Bean生成Spring事務代理。當bean實例的方法需要事務管理時,采用TransactionPoxyFactoryBean來自目標bean生成事務代理。每個TransactionPoxyFactoryBean為一個具體的目標bean生成代理對象,代理對象的方法改寫了目標bean的方法,就是在目標bean的方法執行之前加入開始事務,在目標bean方法結束之后提交事務,遇到指定異常回滾事務。
定義事務代理bean模板
- <bean id="txProxyTemplate" abstract="true"
- class="<SPAN style="COLOR: #ff0000">org.springframework.transaction.interceptor.TransactionProxyFactoryBean</SPAN>">
- <property name="transactionManager">
- <ref bean="transactionManager" />
- </property>
- <property name="transactionAttributes">
- <props>
- <prop key="trans_*">PROPAGATION_REQUIRED</prop>
- <prop key="query*">
- PROPAGATION_REQUIRED,readOnly,-Exception
- </prop>
- <prop key="find*">
- PROPAGATION_REQUIRED,readOnly,-Exception
- </prop>
- <prop key="load*">
- PROPAGATION_REQUIRED,readOnly,-Exception
- </prop>
- <prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
- </props>
- </property>
- </bean>
<bean id="txProxyTemplate" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="trans_*">PROPAGATION_REQUIRED</prop>
<prop key="query*">
PROPAGATION_REQUIRED,readOnly,-Exception
</prop>
<prop key="find*">
PROPAGATION_REQUIRED,readOnly,-Exception
</prop>
<prop key="load*">
PROPAGATION_REQUIRED,readOnly,-Exception
</prop>
<prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
</props>
</property>
</bean>
(2)根據BeanName自動創建事務代理
如果同一個應用中有很多目標bean需要生成事務代理,當然可以為每個目標bean額外配置一個TransactionPoxyFactoryBean bean.這樣做的缺點是,配置文件相當臃腫而且難以維護,此時可以考慮使用自動事務代理。自動事務代理的思路是,當ApplicationContext初始化完成后,由上下文中的某個bean"后處理"每個目標bean,為這些目標bean生成事務代理。
能為目標bean執行"后處理"的bean必須實現BeanFactoryPostProcessor接口,ApplicationContext完成初始化后,會自動初始化所有實現BeanFactoryPostProcessor接口的bean,并且讓它“后處理”其他bean.Spring提供BeanFactoryPostProcessor的實現類BeanNameAutoPoxyCreator,BeanNameAutoPoxyCreator可以用來處理ApplicationContext中其他bean,方法是通過名稱來識別,并且把他們用事務代理包裝起來。BeanNameAutoPoxyCreator生成的事務代理,和使用TransactionPoxyFactoryBean生成的事務代理基本一致。
定義事務攔截bean
- <bean id="transactionInterceptor"
- class="<SPAN style="COLOR: #ff0000">org.springframework.transaction.interceptor.TransactionInterceptor</SPAN>">
- <property name="transactionManager" ref="TransactionManager" />
-
- <property name="transactionAttributes">
- <props>
- <prop key="create*">
- PROPAGATION_REQUIRED,-Exception
- </prop>
- <prop key="delete*">
- PROPAGATION_REQUIRED,-Exception
- </prop>
- <prop key="update*">
- PROPAGATION_REQUIRED,-Exception
- </prop>
- <prop key="get*">PROPAGATION_REQUIRED</prop>
- </props>
- </property>
- </bean>
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="TransactionManager" />
<property name="transactionAttributes">
<props>
<prop key="create*">
PROPAGATION_REQUIRED,-Exception
</prop>
<prop key="delete*">
PROPAGATION_REQUIRED,-Exception
</prop>
<prop key="update*">
PROPAGATION_REQUIRED,-Exception
</prop>
<prop key="get*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
- <bean
- class="<SPAN style="COLOR: #ff0000">org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator</SPAN>">
- <property name="beanNames">
- <value>*Service</value>
- </property>
- <property name="interceptorNames">
- <list>
- <value>transactionInterceptor</value>
- </list>
- </property>
- </bean>
<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<value>*Service</value>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
次配置關鍵在兩個bean
TransactionInterceptor
BeanNameAutoProxyCreator
(3)基于注釋式事務代理配置