Spring AOP 学习笔记

版权声明:本文为博主原创文章,转载请注明作者与出处,http://blog.csdn.net/lixingtao0520 https://blog.csdn.net/lixingtao0520/article/details/83832466

1、Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。

2、@Transactional声明式事务

    Spring事务管理是通过Spring AOP增强实现的。应该是扫描只要含有注解Transactional,实例化时,就会生成基于委托类的代理类对象进行事务增强。

3、@Transactional什么情况下会失效?

    (1)抛出的异常是否支持事务回滚?默认回滚UnChecked异常,如果需要回滚Checked异常需要配置

    (2)修饰的方法是否是public修饰符?protected修饰符虽然可以被子类重写,但是在Aop中是无法找到protected修饰的方法的,因为AOP取的是所有public方法(见参考1)

    (3)是否含有final修饰符?因为CGLIB需要继承被代理的类,所以方法和类不能加final修饰符。(如果有final修饰符,肯定不能实现接口的,因为接口不支持final修饰符)

    (4)确认事务方法是不是通过代理类调用的?如果是直接内部方法调用,则事务不生效。原因待分析。

4、如果想要在protected和private修饰的方法上注解 @Transactional怎么办?

扫描二维码关注公众号,回复: 3992030 查看本文章

参考

 1、关于spring的aop拦截的问题 protected方法代理问题

猜你喜欢

转载自blog.csdn.net/lixingtao0520/article/details/83832466