前提:
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的方式