前提:
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的方式
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有