《spring源代码解析六》由会员分享,可在线阅读,更多相关《spring源代码解析六(14页珍藏版)》请在金锄头文库上搜索。
1、Spring源代码解析(六):Spring声明式事务处理 2009-08-11 (周二) 11:01 Spring Spring 被围观 一共有 419 个打酱油的路过+ 我们看看Spring中的事务处理的代码,使用Spring管理事务有声明式和编程式两种方式,声明式事务处理通过AOP的实现把事物管理代码作为方面封装来横向插入到业务代码中,使得事务管理代码和业务代码解藕。在这种方式我们结合IoC容器和Spirng已有的FactoryBean来对事务管理进行属性配置,比如传播行为,隔离级别等。其中最简单的方式就是通过配置TransactionProxyFactoryBean来实现声明式事物; 在
2、整个源代码分析中,我们可以大致可以看到Spring实现声明式事物管理有这么几个部分: 如转载请注明,转载自:关注Javahttp:/本文链接: http:/ 对在上下文中配置的属性的处理,这里涉及的类是TransactionAttributeSourceAdvisor,这是一个通知器,用它来对属性值进行处理,属性信息放在TransactionAttribute中来使用,而这些属性的处理往往是和对切入点的处理是结合起来的。对属性的处理放在类TransactionAttributeSource中完成。 * 创建事物的过程,这个过程是委托给具体的事物管理器来创建的,但Spring通过Transact
3、ionStatus来传递相关的信息。 * 对事物的处理通过对相关信息的判断来委托给具体的事物管理器完成。 我们下面看看具体的实现,在TransactionFactoryBean中: Java代码 1. public class TransactionProxyFactoryBean extends AbstractSingletonProxyFactoryBean 2. implements FactoryBean, BeanFactoryAware 3. /这里是Spring事务处理而使用的AOP拦截器,中间封装了Spring对事务处理的代码来支持声明式事务处理的实现 4. private
4、final TransactionInterceptor transactionInterceptor = new TransactionInterceptor(); 5.6. private Pointcut pointcut; 7.8. /这里Spring把TransactionManager注入到TransactionInterceptor中去 9. public void setTransactionManager(PlatformTransactionManager transactionManager) 10. this.transactionInterceptor.setTran
5、sactionManager(transactionManager); 11. 12.13. /这里把在bean配置文件中读到的事务管理的属性信息注入到TransactionInterceptor中去 14. public void setTransactionAttributes(Properties transactionAttributes) 15. this.transactionInterceptor.setTransactionAttributes(transactionAttributes); 16. 17.18. 中间省略了其他一些方法. 19.20. /这里创建Spring
6、AOP对事务处理的Advisor 21. protected Object createMainInterceptor() 22. this.transactionInterceptor.afterPropertiesSet(); 23. if (this.pointcut != null) 24. /这里使用默认的通知器 25. return new DefaultPointcutAdvisor(this.pointcut, this.transactionInterceptor); 26. 27. else 28. / 使用上面定义好的TransactionInterceptor作为拦截器
7、,同时使用TransactionAttributeSourceAdvisor 29. return new TransactionAttributeSourceAdvisor(this.transactionInterceptor); 30. 31. 32. public class TransactionProxyFactoryBean extends AbstractSingletonProxyFactoryBean implements FactoryBean, BeanFactoryAware /这里是Spring事务处理而使用的AOP拦截器,中间封装了Spring对事务处理的代码来支
8、持声明式事务处理的实现 private final TransactionInterceptor transactionInterceptor = new TransactionInterceptor(); private Pointcut pointcut;/这里Spring把TransactionManager注入到TransactionInterceptor中去 public void setTransactionManager(PlatformTransactionManager transactionManager) this.transactionInterceptor.setTr
9、ansactionManager(transactionManager); /这里把在bean配置文件中读到的事务管理的属性信息注入到TransactionInterceptor中去 public void setTransactionAttributes(Properties transactionAttributes) this.transactionInterceptor.setTransactionAttributes(transactionAttributes); .中间省略了其他一些方法. /这里创建Spring AOP对事务处理的Advisor protected Object
10、createMainInterceptor() this.transactionInterceptor.afterPropertiesSet(); if (this.pointcut != null) /这里使用默认的通知器 return new DefaultPointcutAdvisor(this.pointcut, this.transactionInterceptor); else / 使用上面定义好的TransactionInterceptor作为拦截器,同时使用TransactionAttributeSourceAdvisor return new TransactionAttri
11、buteSourceAdvisor(this.transactionInterceptor); 那什么时候Spring的TransactionInterceptor被注入到Spring AOP中成为Advisor中的一部分呢?我们看到在TransactionProxyFactoryBean中,这个方法在IOC初始化bean的时候被执行: Java代码 1. public void afterPropertiesSet() 2. . 3. /TransactionProxyFactoryBean实际上使用ProxyFactory完成AOP的基本功能。 4. ProxyFactory proxyF
12、actory = new ProxyFactory(); 5.6. if (this.preInterceptors != null) 7. for (int i = 0; i this.preInterceptors.length; i+) 8. proxyFactory.addAdvisor(this.advisorAdapterRegistry.wrap(this.preInterceptorsi); 9. 10. 11.12. /这里是Spring加入通知器的地方 13. /有两种通知器可以被加入DefaultPointcutAdvisor或者TransactionAttributeS
13、ourceAdvisor 14. /这里把Spring处理声明式事务处理的AOP代码都放到ProxyFactory中去,怎样加入advisor我们可以参考ProxyFactory的父类AdvisedSupport() 15. /由它来维护一个advice的链表,通过这个链表的增删改来抽象我们对整个通知器配置的增删改操作。 16. proxyFactory.addAdvisor(this.advisorAdapterRegistry.wrap(createMainInterceptor(); 17.18. if (this.postInterceptors != null) 19. for (i
14、nt i = 0; i this.postInterceptors.length; i+) 20. proxyFactory.addAdvisor(this.advisorAdapterRegistry.wrap(this.postInterceptorsi); 21. 22. 23.24. proxyFactory.copyFrom(this); 25.26. /这里创建AOP的目标源 27. TargetSource targetSource = createTargetSource(this.target); 28. proxyFactory.setTargetSource(targetSource); 29.30. if (this.proxyInterfaces != null) 31. proxyFactory.setInterfaces(this.proxyInterfaces); 32. 33. else if (!isProxyTargetClass() 34. proxyFactory.setInterfaces(ClassUtils.getAllInterfacesForClass(targetSource.getTargetClass(); 35.