前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何解决Transaction 注解,方法内部调用无效问题

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

作者头像
海涛
发布2020-02-13 00:06:14
1.6K0
发布2020-02-13 00:06:14
举报
文章被收录于专栏:海涛技术日常海涛技术日常

前提:

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

解决办法:

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

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

代码语言:javascript
复制
((ArticleService)AopContext.currentProxy()).getArticleById(id);

注意:需要设置 exposeProxy=true

配置方式:

代码语言:javascript
复制
<aop:aspectj-autoproxy proxy-target-class="true"expose-proxy="true"/>

注解方式:

代码语言:javascript
复制
@SpringBootApplication
@EnableAspectJAutoProxy(exposeProxy=true)
public class DatacenterApplication {
    public static void main(String[] args) {
        SpringApplication.run(DatacenterApplication.class, args);
    }

}

3.手动获取bean

代码语言:javascript
复制
@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的方式

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档