logo头像
Snippet 博客主题

Java八股文查漏补缺-Spring-1-AOP 动态代理

0 写在前面

  Java八股文查漏补缺系列是针对Java八股复习时,针对在面试时候,问的问题可能比较深入,在JavaGuide网站中的一些八股文可能不够用,根据自己的面试经验进行一些学习补充.

  八股文背不如理解,理解深刻,知道底层原理,才能更加牢固。呜呜!直接上题

本文目标:完善AOP动态代理相关内容,AOP有两种,SpringAOPAspectJAOP,前者基于代理,后者基于字节码

1 什么情况下AOP会失效?如何解决

  失效原因有很多,比如没有配置为Bean,切面配置不正确等,但是最符合的条件就是内部增强方法的相互调用,这样就不会触发AOP,没有走代理

image-20240412130119799

解决方案:

  1. 注入当前代理对象

image-20240412130302471

  1. 暴露当前代理对象到本地线程,然后通过AOPContext.currentProxy()拿到当前正在调用的动态代理对象

2 两种动态代理详解

image-20240412131816267

JDK代理:

只能代理接口,目标类与代理类都是实现了接口的方法,代理类进行增强,先执行增强方法,然后通过反射调用目标类方法

CGLib代理:

运行时生成目标类的子类,重写目标类的所有方法,然后进行增强;调用时先通过增强,然后调用父类的对应方法,如果类被final修饰,无法代理

image-20240412131531275