一,不能在private修饰符的方法上
@Transational等注解原理是AOP创建代理类,AOP的底层实现是通过JDK动态代理或者CGLIB动态代理。
JDK动态代理,一般是针对接口的。根据Java的单继承多实现原则,在继承了Proxy.class后只能通过实现接口来实现新的代理类生成。
CGLIB是针对类的,生成的代理类也是继承了原有的类。
父类的private私有属性是不可以被继承的,所以无法生效。
二,类中的方法间调用,调用方没有加注解,被调用方加注解了。
此时生成的代理类如下图
所以看的出来一直调用的是没有增强事务的普通方法,所以不生效。
解决方法:
1.将需要加事务的方法放到其他类中。
2.采用AopContext,和类上的@EnableAspectJAutoProxy(exposeProxy = true)注解使其真正的调用被增强后的方法。
method noTransationTask(){
((YourClass)AopContext.currentProxy()).transationTask()
}