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