通过Spring AOP 实现Spring声明式事务管理;
Spring支持编程式事务管理和声明式事务管理两种方式。
一种是注解事务管理 一种是XML事务管理。
注解事务管理代码如下:
1 //@Service("myNewsService") 2 @Transactional 3 @Service 4 @Scope("prototype") 5 public class NewsServiceImpl implements NewsService { 6 7 //Autowired和Qualifier 属于spring的注解, 8 9 10 //jdk自带注解resource可以替代Autowired 11 /* 12 * 用resource的好处: 13 * 1. 代码与spring 解耦,不依赖于spring 14 * 2. 代码中没有spring的存在,可以随时切换任意一套类似spring的框架 15 */ 16 @Autowired 17 //@Qualifier("myNewsDao") 18 //@Resource(name="myNewsDao") 19 private NewsDao nd; 20 21 22 @Override 23 @Transactional(readOnly=true) 24 public List showAllNews() { 25 //可以增加一个业务逻辑,比如:把文章的内容进行截取为20字符 26 //通过DAO获取数据 27 List<News> allNewList = nd.showAllNews(); 28 //在return 之间,可以进行各种业务逻辑操作 29 30 return allNewList; 31 } 32 33 @Override 34 public String findNews() { 35 // TODO Auto-generated method stub 36 return null; 37 } 38 39 @Override 40 @Transactional
(使用spring的Transactional注解用于通知spring需要加入事物的方法。)
41 public String deleteSingleNews(Integer id) { 42 //需要做以下判断,例如有没有权限删除,又或者判断下面是否有级联子子记录 43 44 //当可以删除时,调用DAO给直接删除 45 String returnValue = "deleteFailed"; 46 returnValue = nd.deleteSingleNews(id); 47 // TODO Auto-generated method stub 48 return returnValue; 49 } 50 51 }
XML事物管理的代码:
1 </bean> 2 3 4 <bean class="org.springframework.orm.hibernate5.HibernateTransactionManager" id="transactionManager"> 5 6 <property ref="sessionFactory" name="sessionFactory"/> 7 8 </bean> 9 10 11 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 12 13 14 <tx:attributes> 15 16 </tx:advice> 17 18 19 <aop:config> 20 21 <aop:pointcut id="interceptorPointCuts" expression="execution(* news.dao.*.*(..))"/> 22 23 <aop:advisor pointcut-ref="interceptorPointCuts" advice-ref="txAdvice"/> 24 25 </aop:config> 26 27 </beans>
我们使用<tx:advice/>标签,这将创建我们定义了一个切入点匹配所有我们想做成事务,并引用其中的事务通知方法的事务并同时处理建议。
如果一个方法的名字已被列入事务配置,然后创建意见,将调用该方法之前开始交易。
目标方法将在一个try/ catch块被执行。
如果方法正常完成,AOP的建议提交事务成功,否则执行回滚。