1, Spring bean 定義
spring bean 定義可能包含大量的配置信息,包括容器相關(guān)的信息(比如初始化方法,靜態(tài)工廠方法
等)、構(gòu)造函數(shù)參數(shù)、屬性等。如果兩個(gè)bean之間的配置信息大同小異,可采用bean的繼承來減少重
復(fù)配置工作。子bean定義可以從父bean定義繼承部分配置。它也可覆蓋一些配置,或者添加一些配置
。使用繼承配置可以節(jié)省很多輸入工作,實(shí)際上就是一種模板形式。
spring中事務(wù)配置中就有這樣例子,為了使用事務(wù)只要父配置了事務(wù)代理就可以了,所有需要事務(wù)的
bean只要繼承父就可以了。說到這個(gè)就在多說幾句,父bean通常不需要實(shí)例化的,而僅僅作為子bean
定的的模板使用;而ApplicationContext默認(rèn)預(yù)初始化所有的singleton bean。為了阻止父bean被預(yù)
初始化,可以使用abstract屬性設(shè)置父bean為抽象bean。容器會(huì)忽略所有的抽象bean定義,預(yù)初始化
時(shí)不初始化抽象bean。
2, spring 事務(wù)管理
傳統(tǒng)的J2EE開發(fā)者對(duì)事務(wù)管理可能采用兩種策略
(1),全局事務(wù):全局事務(wù)通常由應(yīng)用服務(wù)器管理,使用JTA。全局事務(wù)可跨越多個(gè)事務(wù)性的資源,保證
在多個(gè)事務(wù)性資源間跨越時(shí)資源一致性。
(2),局部事務(wù):局部事務(wù)和特定資源相關(guān),如,一個(gè)和JDBC鏈接關(guān)聯(lián)的事務(wù)。該事務(wù)盡能保證對(duì)該
JDBC連接數(shù)據(jù)庫(kù)的一致性,對(duì)局部事務(wù),應(yīng)用服務(wù)器不需要參與事務(wù)管理,不能保證跨越多個(gè)資源的
事務(wù)正確性。
3,編程式事務(wù)
Spring 提供兩種編程式的事務(wù)管理
(1)使用TransactionTemplate事務(wù)管理
(2)直接使用一個(gè)PlatformTransactionManager實(shí)現(xiàn)類管理事務(wù)。
兩種編程式的事務(wù)都不需要與特定的事務(wù)API耦合,第一種更符合Spring模板式的編程模型,因此通常推薦采用第一種方式,第二種非常類似于JTA的UserTransaction的API編程,區(qū)別是減少了異常處理。
4,聲明式事務(wù)
Spring的聲明式事務(wù)是通過面向切面(AOP)實(shí)現(xiàn)。
(1)使用聲明式事務(wù)管理
通常,通過TransactionPoxyFactoryBean為目標(biāo)Bean生成Spring事務(wù)代理。當(dāng)bean實(shí)例的方法需要事務(wù)管理時(shí),采用TransactionPoxyFactoryBean來自目標(biāo)bean生成事務(wù)代理。每個(gè)TransactionPoxyFactoryBean為一個(gè)具體的目標(biāo)bean生成代理對(duì)象,代理對(duì)象的方法改寫了目標(biāo)bean的方法,就是在目標(biāo)bean的方法執(zhí)行之前加入開始事務(wù),在目標(biāo)bean方法結(jié)束之后提交事務(wù),遇到指定異常回滾事務(wù)。
定義事務(wù)代理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)根據(jù)BeanName自動(dòng)創(chuàng)建事務(wù)代理
如果同一個(gè)應(yīng)用中有很多目標(biāo)bean需要生成事務(wù)代理,當(dāng)然可以為每個(gè)目標(biāo)bean額外配置一個(gè)TransactionPoxyFactoryBean bean.這樣做的缺點(diǎn)是,配置文件相當(dāng)臃腫而且難以維護(hù),此時(shí)可以考慮使用自動(dòng)事務(wù)代理。自動(dòng)事務(wù)代理的思路是,當(dāng)ApplicationContext初始化完成后,由上下文中的某個(gè)bean"后處理"每個(gè)目標(biāo)bean,為這些目標(biāo)bean生成事務(wù)代理。
能為目標(biāo)bean執(zhí)行"后處理"的bean必須實(shí)現(xiàn)BeanFactoryPostProcessor接口,ApplicationContext完成初始化后,會(huì)自動(dòng)初始化所有實(shí)現(xiàn)BeanFactoryPostProcessor接口的bean,并且讓它“后處理”其他bean.Spring提供BeanFactoryPostProcessor的實(shí)現(xiàn)類BeanNameAutoPoxyCreator,BeanNameAutoPoxyCreator可以用來處理ApplicationContext中其他bean,方法是通過名稱來識(shí)別,并且把他們用事務(wù)代理包裝起來。BeanNameAutoPoxyCreator生成的事務(wù)代理,和使用TransactionPoxyFactoryBean生成的事務(wù)代理基本一致。
定義事務(wù)攔截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>
次配置關(guān)鍵在兩個(gè)bean
TransactionInterceptor
BeanNameAutoProxyCreator
(3)基于注釋式事務(wù)代理配置