Spring @Transational 注解失效

一,不能在private修饰符的方法上

    @Transational等注解原理是AOP创建代理类,AOP的底层实现是通过JDK动态代理或者CGLIB动态代理。

JDK动态代理,一般是针对接口的。根据Java的单继承多实现原则,在继承了Proxy.class后只能通过实现接口来实现新的代理类生成。

CGLIB是针对类的,生成的代理类也是继承了原有的类。

父类的private私有属性是不可以被继承的,所以无法生效。

二,类中的方法间调用,调用方没有加注解,被调用方加注解了。

此时生成的代理类如下图

所以看的出来一直调用的是没有增强事务的普通方法,所以不生效。

解决方法:

1.将需要加事务的方法放到其他类中。

2.采用AopContext,和类上的@EnableAspectJAutoProxy(exposeProxy = true)注解使其真正的调用被增强后的方法。

method noTransationTask(){

((YourClass)AopContext.currentProxy()).transationTask()

}

你可能感兴趣的:(Spring @Transational 注解失效)