前言:spring框架對於事務管理提供了兩種方案。一,編程式事務、二,聲明式事務。本例主要剖析 聲明式事務。spring
何爲聲明式事務:express
經過spring的配置文件配置事務規則,或使用spring @Transactional註解兩種方式通知咱們系統中哪些方法須要引入事務支持。編程
使用配置文件配置事務session
1 <!-- 使用spring聲明式事務 --> 2 <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> 3 <property name="sessionFactory" ref="mySessionFactory"></property> 4 </bean> 5 6 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 7 <tx:attributes> 8 <tx:method name="add*" propagation="REQUIRED" /> 9 <tx:method name="del*" propagation="REQUIRED" /> 10 <tx:method name="mod*" propagation="REQUIRED" /> 11 <tx:method name="*" propagation="REQUIRED" read-only="true" /> 12 </tx:attributes> 13 </tx:advice> 14 15 <aop:config> 16 <aop:pointcut id="interceptorPointCuts" 17 expression="execution(* 18 news.dao.*.*(..))" /> 19 <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" /> 20 </aop:config>
解析:① 因爲本例是給數據訪問層的方法添加事務管理,所以咱們須要配置一個org.springframework.orm.hibernate5.HibernateTransactionManager ,這個類的一個bean。框架
② tx:advice節點則是配置咱們須要引入事務管理類的方法名,這裏spring容許咱們使用通配符(*)。ide
③ aop:config這個節點則是配置咱們的工程中有哪些類以及哪些方法須要引入事務管理,同理依舊可使用通配符。本例news.dao.*.*(..))這句的意義爲:咱們工程中news包下面的dao包下面的全部類以及全部方法都須要引入事務管理。學習
使用spring註解實現事務管理spa
1 @Override 2 @Transactional(readOnly=true) 3 public List showAllNews() { 4 List<News> allNewList = nd.showAllNews(); 5 //在return 之間,能夠進行各類業務邏輯操做,本例省略 6 7 return allNewList; 8 }
解析:以上代碼段是截取自業務層某一個方法的片斷,在這裏咱們只須要加入@Transactional這一個spring的註解就是這麼簡單就能夠實現事務管理了,同時咱們配置文件中也無需配置tx:advice和aop:config這兩個比較麻煩的節點了。hibernate
總結:兩種方式均可以實現事務管理,使用註解一步到位,爲何咱們還要學一個這麼複雜的xml文件配置來實現事務管理呢。博主在當時學習的時候一樣有這樣的疑問。在這裏我簡單解析一下這二者如何取捨。一,xml文件配置能夠實現使咱們的代碼簡化,並必定程度上與代碼解耦,一旦咱們的工程須要替換框架,只需改動配置,而無需改動源碼。二,使用註解能夠很是直觀的理解咱們的源碼,提升了可讀性,不過只建議在一個相對較小,框架固定的工程中使用。具體該使用哪一種方式還得依據具體狀況分析。code