Java八股文查漏补缺-Spring-1-AOP 动态代理
0 写在前面
Java八股文查漏补缺系列是针对Java八股复习时,针对在面试时候,问的问题可能比较深入,在
JavaGuide
网站中的一些八股文可能不够用,根据自己的面试经验进行一些学习补充.八股文背不如理解,理解深刻,知道底层原理,才能更加牢固。呜呜!直接上题
本文目标:完善AOP
、动态代理
相关内容,AOP
有两种,SpringAOP
与AspectJAOP
,前者基于代理,后者基于字节码
1 什么情况下AOP会失效?如何解决
失效原因有很多,比如没有配置为Bean,切面配置不正确等,但是最符合的条件就是内部增强方法的相互调用,这样就不会触发AOP,没有走代理
解决方案:
- 注入当前代理对象
- 暴露当前代理对象到本地线程,然后通过
AOPContext.currentProxy()
拿到当前正在调用的动态代理对象
2 两种动态代理详解
JDK代理:
只能代理接口,目标类与代理类都是实现了接口的方法,代理类进行增强,先执行增强方法,然后通过反射调用目标类方法
CGLib代理:
运行时生成目标类的子类,重写目标类的所有方法,然后进行增强;调用时先通过增强,然后调用父类的对应方法,如果类被final
修饰,无法代理