内容来自《Java Web 程序员面试笔试宝典》
【出现频率】★★★☆☆ 【学习难度】★★★☆☆
答案:基于接口的 JDK 动态代理的 AOP 事务增强,由于接口的方法是 public 的,所以实现类的实现方法必须是 public 的(不能是 protected、private等)同时不能使用 static 的修饰符。
而基于CGLIB字节码动态代理是通过扩展被增强类,动态创建子类的方式进行AOP增强的。由于使用 final、static、private修饰符的方法都不能子类覆盖,相应的,这些方法将不能被实施的 AOP 增强。
所以,基于上述两方面原因,在使用@Transactional时,需要注意方法的修饰符的使用,@Transactional注解只被应用到public可见度的方法上。否则,虽然不会报错,但是事务配置也不会起作用。