spring的事務管理有兩種,一種是編程式的事務管理,另外一種是聲明式事務管理。編程式事務管理比較靈活,但是代碼量大,存在相互重復的代碼;聲明式事務管理比編程式事務管理更為靈活。
編程式事務管理需要自己手動寫代碼實現事務的功能。聲明式事務管理只需要配置文件的設置即可或者是結合注解共同使用。
本次,我只解析聲明式事務管理。並且,本次例子建立在ssh框架之上的應用,如果沒有搭建好的,可以參考http://www.cnblogs.com/demoMeng/
一、聲明式事務管理(純spring配置文件)
1、搭建好相關的ssh框架
2、配置聲明式事務管理的spring的配置文件:applicationContext.xml,具體請參考代碼:
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="mySessionFactory"></property> </bean>
<!-- 假定這個tx:advice 標簽是springAOP中 handler --> <!-- <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="del*" propagation="REQUIRED" /> <tx:method name="mod*" propagation="REQUIRED" /> <tx:method name="*" propagation="REQUIRED" read-only="true" /> </tx:attributes> </tx:advice> --> <!-- 那麼下面的aop:config就是springAOP中的target --> <!-- <aop:config> <aop:pointcut id="interceptorPointCuts" expression="execution(* dao.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" /> </aop:config>
解析:
tx:advice假定是handler(代理),這個handler需要引用一個transactionManager(事務管理器)。
定義一個bean作為事務管理對象,添加一個class屬性,值需要為hibernate5.X的版本。
tx:attributes標簽下的子標簽有一個tx:method中的name屬性是dao中的方法名,一般來說是add(增)delete(刪)modify(改)query(查詢),查詢一般設置只讀。這裡使用通配符以適應不用的命名規則。propagation設置事務的傳播行為,一般設置為默認值REQUIRED。
aop:config下的aop:pointcut標簽,顧名思義切面。其中expression設置是哪裡需要添加事務管理,也就是AOP中的切面。比如說:開啟事務,提交事務,關閉session等這些通用的相同的代碼,把他們設置為一個切面。免去重復書寫。本例在dao包下的所有方法進行添加事務管理,也就是在dao包所有的類都不需要做開啟事務,提交事務,關閉session的事情了,這些事情全部交給transactionManager來做。
最後的aop:advisor標簽把tx:advice和aop:pointcut進行連接,實現了聲明式事務管理。
二、聲明式事務管理(配置文件+spring注解)
1、搭建好相關的ssh框架應用。
2、編寫相關的配置文件:applicationContext.xml 具體請參考如下代碼:
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="mySessionFactory"></property> </bean> <tx:annotation-driven transaction-manager="transactionManager" />
3、spring注解:
⑴、在類上注解:
⑵、在具體的方法上注解:
注意:這些在類上的注解或者是在方法上的注解都是在調用dao層的實現類上寫的,即注解需要寫在dao的上一層。本例中service調用了dao層,所以注解是寫在service層而不是dao層。
三、純配置文件和配置文件+注解區別:
二者的最大的區別就是耦合性的問題。純配置文件和spring框架的耦合程度低,而配置文件+注解和spring框架的耦合性程度高,但是代碼的可讀性較高。