Spring聲明式事務(wù)的四種方式Spring中幾種常見的事務(wù)配置,是Aop和Ioc的充分體現(xiàn)
以下兩個(gè)bean的配置是下面要用到的。 <!-- 定義事務(wù)管理器(聲明式的事務(wù)) --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean> <!-- *******業(yè)務(wù)邏輯層(是對(duì)各個(gè)DAO層的正面封裝)主要用到<<門面模式>>****** --> <bean id="fundService" class="com.jack.fund.service.serviceimpl.FundService"> <property name="operdao"> <ref bean="operatorDAO" /> </property> <property name="producedao"> <ref bean="fundProduceDAO" /> </property> <property name="customerdao"> <ref bean="customerDAO" /> </property> <property name="accountdao"> <ref bean="accountDAO" /> </property> <property name="fundaccountdao"> <ref bean="fundAccountDAO" /> </property> <property name="fundtransdao"> <ref bean="fundTransDAO" /> </property> </bean> 可能還有其他很多模塊。<bean id="fundService"/>可能只是其中的模塊。 第一種:配置聲明式事務(wù)的方法如下。也是我們最常用的方法了,它適用于你的庫表比較少的情況下。 <bean id="fundServiceDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <!-- 配置事務(wù)管理器 --> <property name="transactionManager"> <ref bean="transactionManager" /> </property> <!-- 此屬性指定目標(biāo)類本身是否是代理的對(duì)象,如果目標(biāo)類沒有實(shí)現(xiàn)任何類,就設(shè)為true代表自己 --> <property name="proxyTargetClass"> <value>false</value> </property> <property name="proxyInterfaces"> <value>com.jack.fund.service.IFundService</value> </property> <!-- 目標(biāo)bean --> <property name="target"> <ref bean="fundService" /> </property> <!-- 配置事務(wù)屬性 --> <property name="transactionAttributes"> <props> <prop key="delete*">PROPAGATION_REQUIRED</prop> <prop key="add*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean> 以下可能還有其他的xxxServiceDAOProxy.大家可以看出針對(duì)每一個(gè)功能模塊配置一個(gè)業(yè)務(wù)代理服務(wù)。如果模塊多大話,就顯得代碼有點(diǎn)多了,發(fā)現(xiàn)他們只是稍微一點(diǎn)不一樣。這時(shí)我們就應(yīng)該想到繼承的思想。用第二種方法。 第二種:配置聲明式事務(wù)的方法如下。這種情況適合相對(duì)比較多的模塊時(shí)使用。 <!-- 利用繼承的思想簡(jiǎn)化配置,要把a(bǔ)bstract="true" --> <bean id="transactionBase" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true"> <!-- 配置事務(wù)管理器 --> <property name="transactionManager"> <ref bean="transactionManager" /> </property> ... </bean> 而具體的模塊可以簡(jiǎn)單的這樣配置。只要指明它的parent(父類)就可以了。父類一般把a(bǔ)bstract="true",因?yàn)樵谌萜骷虞d的時(shí)候不需要初始化,等到用的時(shí)候再有它的子類調(diào)用的時(shí)候,再去初始化。 <bean id="fundServiceDAOProxy" parent="transactionBase" > <property name="target"> <ref bean="fundService" /> </property> </bean> 這樣配置的話,如果有多個(gè)像fundService這樣模塊時(shí),可以少些很多重復(fù)的代碼。 第三種:配置聲明式事務(wù)的方法如下。主要利用BeanNameAutoProxyCreator自動(dòng)創(chuàng)建事務(wù)代理 <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager"> <ref bean="transactionManager" /> </property> ... </bean> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <value>fundService</value> </list> </property> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> </bean> 這種方法主要利用了攔截器的原理。 前三種方法一般都必需指定具體的模塊bean.如果模塊過多話,比如一個(gè)大型的網(wǎng)站一般有幾十個(gè)模塊。我們就得考慮用第四種的配置方式了。自動(dòng)創(chuàng)建事務(wù)代理的方式了。 第四種:配置聲明式事務(wù)的方法如下。 <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager"> <ref bean="transactionManager" /> </property> ... </bean> <!-- 自動(dòng)代理 --> <bean id="autoproxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <!-- 可以是Service或DAO層(最好是針對(duì)業(yè)務(wù)層*Service) --> <property name="beanNames"> <list> <value>*Service</value> </list> </property> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> </bean> 自動(dòng)代理還有一種用法就是結(jié)合正規(guī)表達(dá)式和advice使用。 <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager"> <ref bean="transactionManager" /> </property> ... </bean> <bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" /> <bean id="regexpMethodPointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="advice"> <ref bean="transactionInterceptor" /> </property> <property name="pattern"> <value>.*</value> </property> </bean> 這個(gè)方法可以針對(duì)具體的模塊進(jìn)行攔截并進(jìn)行事務(wù)處理。在你的實(shí)際項(xiàng)目中,你可以根據(jù)你的情況選用不同的方法。 |
|