每日学习 Spring Aop源码分析 具体是如何创建Aop代理的
博客原文 : https://lionli.blog.csdn.net/article/details/135578383?spm=1001.2014.3001.5502
Spring中的代理模式 要首当其冲的肯定是AOP了 接下来我们来看看在AOP中是如何使用代理模式的
这里涉及到一个注解 如果需要开启AOP那么需要增加这个注解 @EnableAspectJAutoProxy
查看注解我们知道引入了一个 AspectJAutoProxyRegistrar 类,通过查看AspectJAutoProxyRegistrar 得到
AspectJAutoProxyRegistrar 该方法的作用就是往Spring容器中添加一个 BeanDefinition 类型为 AnnotationAwareAspectJAutoProxyCreator 用于创建代理对象
进入 AnnotationAwareAspectJAutoProxyCreator 看看是如何创建代理的
可以看到传入了AnnotationAwareAspectJAutoProxyCreator对象
由于 AnnotationAwareAspectJAutoProxyCreator 中并没有创建代理的方法 那么我们只能向上去父类里找, 通过不断的探索在 AnnotationAwareAspectJAutoProxyCreator -> AspectJAwareAdvisorAutoProxyCreator -> AbstractAdvisorAutoProxyCreator -> AbstractAutoProxyCreator 抽象类 AbstractAutoProxyCreator 中找到了 createProxy 方法
此方法是bean初始化的前置处理器 postProcessBeforeInstantiation 中使用的, 也就是说bean在初始化之前, 代理对象就已经创建好了
进入 createProxy 方法
进入 buildProxy 方法
这里我们可以看出 实际的代理对象是通过 ProxyFactory 工厂的 getProxyClass 与 getProxy 两个方法创建的
通过 getProxyClass 方法一直往下点 找到最终创建方法 DefaultAopProxyFactory#createAopProxy 为止
总结
@EnableAspectJAutoProxy 注解
@EnableAspectJAutoProxy 注解是启动 Spring AOP 功能的关键,它会启用基于注解的 AOP 支持。
当我们在 Spring 配置类上使用 @EnableAspectJAutoProxy 时,Spring 会通过 AspectJAutoProxyRegistrar 注册相关的 Bean,并进行自动代理的设置。
AspectAutoProxyRegistrar
AspectAutoProxyRegistrar 这个类的作用就是注册与 AOP 相关的 Bean,特别是自动代理创建器。在内部,AspectAutoProxyRegistrar 会注册一个 AnnotationAwareAspectJAutoProxyCreator 的 Bean 定义。
这个注册过程是通过 BeanDefinitionRegistry 来完成的。AspectAutoProxyRegistrar 通过 registerBeanDefinitions() 方法将一个 AnnotationAwareAspectJAutoProxyCreator 注册到容器中。
AnnotationAwareAspectJAutoProxyCreator
AnnotationAwareAspectJAutoProxyCreator 是实现 AOP 自动代理的核心组件之一,它是 AbstractAutoProxyCreator 的一个子类。
它的主要功能是扫描被 @Aspect 和切面相关注解(如 @Transactional)标记的 Bean,然后基于这些切面信息来创建代理对象。
当 Spring 容器启动时,AnnotationAwareAspectJAutoProxyCreator 会被初始化,它负责:
检查哪些 Bean 被切面标记(例如使用 @Aspect 注解的类)。
为符合条件的 Bean 创建代理(通过 JDK 动态代理或 CGLIB 代理)。
在目标 Bean 的方法执行之前和之后,插入切面逻辑(如通知)。
代理对象的创建
AnnotationAwareAspectJAutoProxyCreator 会使用代理机制(如 JDK 动态代理或 CGLIB 代理)为目标 Bean 创建代理对象。如果目标 Bean 实现了接口,则通常会使用 JDK 动态代理;如果没有实现接口,则会使用 CGLIB 创建子类代理。
代理对象的创建是在 Bean 实例化和注入过程中完成的。当 Spring 容器实例化一个 Bean 时,AnnotationAwareAspectJAutoProxyCreator 会检查该 Bean 是否需要代理。如果需要,它会为该 Bean 创建代理,并将代理对象注入到容器中。