前言:spring框架對於事務管理提供了兩種方案。一,編程式事務、二,聲明式事務。本例主要剖析 聲明式事務。
何為聲明式事務:
通過spring的配置文件配置事務規則,或使用spring @Transactional注解兩種方式通知我們系統中哪些方法需要引入事務支持。
使用配置文件配置事務
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允許我們使用通配符(*)。
③ aop:config這個節點則是配置我們的工程中有哪些類以及哪些方法需要引入事務管理,同理依舊可以使用通配符。本例news.dao.*.*(..))這句的意義為:我們工程中news包下面的dao包下面的所有類以及所有方法都需要引入事務管理。
使用spring注解實現事務管理
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這兩個比較麻煩的節點了。
總結:兩種方式都可以實現事務管理,使用注解一步到位,為什么我們還要學一個這么復雜的xml文件配置來實現事務管理呢。博主在當時學習的時候同樣有這樣的疑問。在這里我簡單解析一下這兩者如何取舍。一,xml文件配置可以實現使我們的代碼簡化,並一定程度上與代碼解耦,一旦我們的工程需要替換框架,只需改動配置,而無需改動源碼。二,使用注解可以非常直觀的理解我們的源碼,提高了可讀性,不過只建議在一個相對較小,框架固定的工程中使用。具體該使用哪種方式還得依據具體情況分析。