spring 事務傳播

在service中有兩個方法 A和 B,

A沒有配置事務,B配事務,

若在A中調用B方法時,事務將不起作用,原因是因爲spring的事務是基於AOP的方式,是代理類加的增強,Proxy.B,若在內部調用時則僅是直接調用B,事務將失效。


解決方法:1 將B移到另一個類中

                 2 A調用B時不直接調用B,而是調用AOP代理類 的B方法

                  可以在A實現類中聲明A接口 然後加載時將代理類賦給它。

              

           

[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. @Service  
  2. public class InjectBeanSelfProcessor implements BeanPostProcessor , ApplicationContextAware {  
  3.       
  4.      private ApplicationContext context;    
  5.         //① 注入ApplicationContext    
  6.         public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {    
  7.             this.context = applicationContext;    
  8.         }   
  9.       
  10.     public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {  
  11.       
  12.         if (bean instanceof BeanSelfAware) {  
  13.             if (AopUtils.isAopProxy(bean)) {  
  14.                 LogConstant.debugLog.info("[postProcessAfterInitialization][isAopProxy][beanName = "+beanName+"][className= "+bean.getClass()+"]" );  
  15.                 ((BeanSelfAware) bean).setSelf(bean);  
  16.             } else {  
  17.                 ((BeanSelfAware) bean).setSelf(context.getBean(beanName));  
  18.                 LogConstant.debugLog.info("[postProcessAfterInitialization][isNotAopProxy][beanName = "+beanName+"][className= "+bean.getClass()+"]" );  
  19.             }  
  20.         }  
  21.         return bean;  
  22.     }  
  23.       
  24.     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {  
  25.       
  26.         return bean;  
  27.     }  
  28. }  


  3. 通過Threadlocal暴漏AOP代理對象,

     3.1.配置

  1. <aop:aspectj-autoproxy expose-proxy="true"/><!—註解風格支持-->  

     3.2在A方法中AopContext.currentProxy()).b(); 調用B方法



參考博客:http://jinnianshilongnian.iteye.com/blog/1487235

            http://jinnianshilongnian.iteye.com/blog/1492424

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章