如何解决Transaction 注解,方法内部调用无效问题

被刻印的时光 ゝ 提交于 2020-02-26 00:04:11

前提:

Transaction 注解开启事务,是通过代理对象对方法进行封装开启和关闭事务,但生效的的条件是外部调用,而内部调用并不会走代理对象,这就造成了事务失效。

解决办法:

1.逻辑优化,避免内部调用(自己评估)

2.通过AopContext.currentProxy()获取当前类的代理对象 

((ArticleService)AopContext.currentProxy()).getArticleById(id);

注意:需要设置 exposeProxy=true

配置方式:

<aop:aspectj-autoproxy proxy-target-class="true"expose-proxy="true"/>

注解方式:

@SpringBootApplication
@EnableAspectJAutoProxy(exposeProxy=true)
public class DatacenterApplication {
    public static void main(String[] args) {
        SpringApplication.run(DatacenterApplication.class, args);
    }

}

 3.手动获取bean

@Component
public class SpringUtils  implements ApplicationContextAware {

        private static ApplicationContext applicationContext;
        @Override
        public void setApplicationContext(ApplicationContext applicationContextParam) throws BeansException {
            applicationContext=applicationContextParam;
        }
        public static Object getObject(String id) {
            Object object = null;
            object = applicationContext.getBean(id);
            return object;
        }
        public static <T> T getObject(Class<T> tClass) {
            return applicationContext.getBean(tClass);
        }

        public static Object getBean(String tClass) {
            return applicationContext.getBean(tClass);
        }

        public <T> T getBean(Class<T> tClass) {
            return applicationContext.getBean(tClass);
        }
}

附件:方式三 也可以参考 https://blog.csdn.net/qq_26631651/article/details/89290856  这种获取 bean的方式

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!