## AopContext
- [AopContext](#aopcontext)
- [一、基本信息](#一基本信息)
- [二、基本描述](#二基本描述)
- [三、主要功能](#三主要功能)
- [四、类源码](#四类源码)
- [五、最佳实践](#五最佳实践)
- [六、源码分析](#六源码分析)
- [JDK动态代理拦截器](#jdk动态代理拦截器)
- [CGLIB动态代理拦截器](#cglib动态代理拦截器)
- [七、常见问题](#七常见问题)
### 一、基本信息
✒️ **作者** - Lex 📝 **博客** - [掘金](https://juejin.cn/user/4251135018533068/posts) 📚 **源码地址** - [github](https://github.com/xuchengsheng/spring-reading)
### 二、基本描述
`AopContext`类是Spring AOP框架提供的一个工具类,用于在方法内部访问当前AOP代理对象。通过`currentProxy()`方法,可以获取当前方法被AOP代理后的代理对象,从而在方法内部执行代理对象的其他方法或获取相关信息。
### 三、主要功能
1. **获取当前AOP代理对象**
+ 通过调用`currentProxy()`方法,可以在方法内部获取到当前的AOP代理对象,即被AOP增强后的对象。
2. **允许在方法内部调用代理对象的方法**
+ 获得代理对象后,可以在方法内部直接调用代理对象的其他方法,包括被增强的切面方法或目标对象的方法。
3. **解决代理对象的传递问题**
+ 在一些特定场景下,可能需要在不同的方法间传递AOP代理对象,而不是直接调用`this`。`AopContext`类提供了一种解决方案,可以在方法调用间传递AOP代理对象。
### 四、类源码
`AopContext`类提供了用于获取当前AOP调用信息的静态方法集合。通过`currentProxy()`方法可以获取当前AOP代理对象,前提是AOP框架已配置为暴露代理对象。这对目标对象或通知进行增强调用,以及查找通知配置非常有用。然而,由于性能成本较高,Spring的AOP框架默认不会暴露代理对象。
```java
/**
* 用于获取当前AOP调用信息的静态方法集合。
*
*
如果AOP框架配置为暴露当前代理对象(非默认情况),则可使用 {@code currentProxy()} 方法获取正在使用的AOP代理对象。
* 目标对象或通知可以使用此方法进行增强调用,类似于EJB中的 {@code getEJBObject()}。也可用于查找通知配置。
*
*
Spring的AOP框架默认不暴露代理对象,因为这样做会带来性能开销。
*
*
此类中的功能可被目标对象使用,以获取调用中的资源。然而,当存在合理替代方案时,不应使用此方法,因为这会使应用程序代码依赖于AOP下的使用和Spring AOP框架。
*
* @author Rod Johnson
* @author Juergen Hoeller
* @since 13.03.2003
*/
public final class AopContext {
/**
* 线程本地变量,用于保存与该线程关联的AOP代理对象。
* 除非控制代理配置的“exposeProxy”属性被设置为“true”,否则将包含{@code null}。
* @see ProxyConfig#setExposeProxy
*/
private static final ThreadLocal