SpringAOP源码学习总结

本文详细阐述了使用@EnableAspectJAutoProxy启用AOP的过程,包括创建AspectJAwareAdvisorAutoProxyCreator,生成切面缓存,以及如何在调用方法时通过责任链模式执行advice链。解析了从创建代理对象到最终调用advice的具体步骤。

1.使用@EnableAspectJAutoProxy启用aop
在这里插入图片描述
2.创建abstractAutoProxyCreator
   使用@EnableAspectJAutoProxy后, 可以看到会@Import(AspectJAutoProxyRegistrar.class)
在这里插入图片描述
   AspectJAutoProxyRegistrar将名为“org.springframework.aop.config.internalAutoProxyCreator”的AnnotationAwareAspectJAutoProxyCreator 注册进容器,该proxyCreator是AbstractAdvisorAutoProxyCreator的子类。

   初始化Spring容器的时候会在refresh() -> registerBeanPostProcessors() 遍历实现ordered接口的__beanPostProcessors__的时候getBean(AspectJAwareAdvisorAutoProxyCreator). 此处成功创建了AspectJAwareAdvisorAutoProxyCreator 。该proxyCreator 是一个abstractAutoProxyCreator的子类,是beanPostProcessor的实现. 会在initializeBean的时候被触发,用于!创建代理对象。

3.创建advistor(切面)到缓存
   在preInstantiateSingletons()阶段, 在处理internalEventListenerProcessor的时候,createBean>resolveBeforeInstantiation>applyBeanPostProcessorsBeforeInstantiation,之前创建的proxyCreator会作为其postBeanProssor,postProcessBeforeInstantiation(),获取所有@AspectJ , 并将advisors添加到缓存①。(ps:猜想此处并不一定需要该 listenerProcessor来触发。 只是第一次触发后之后直接取了缓存而已)
注:org.springframework.context.event.internalEventListenerProcessor.internalEventListenerProcessor 实际对应EventListenerMethodProcessor.class

4.生成代理对象
   当使用了@Aspect拦截后
在这里插入图片描述

   context.getBean(bean)的时候会触发doCreateBean>initializeBean>applyBeanPostProcessorsBeforeInstantiation>BeanPostProcessor.postProcessBeforeInstantiation() 此处BeanPostProcessor 指的之前的proxyCreator, 会把①处获得的所有advisors通过canApply过滤, 如果剩有advisors 就说明需要使用createProxy创建代理对象,接下来就是通过jdk/cglib创建代理对象并返回。

5.调用advice链
   当代理对象调用方法的时候, 代理对象执行intercept,通过 List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass)得到advice链,该chain 是一个倒序的chain.将chain传入new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed();创建一个invocation去执行,这里是用到责任链模式,顺序如下:
在这里插入图片描述

   1-4步的方法执行顺序:
在这里插入图片描述

### Spring AOP源码解析与实现机制 Spring AOP 是基于代理模式的一种动态代理技术,它通过拦截目标对象的方法调用来实现在不修改原有业务逻辑的情况下增强其行为的功能。以下是关于 Spring AOP 源码实现及其工作原理的具体分析: #### 1. 核心概念 AOP 中涉及的关键术语包括切面(Aspect)、连接点(Join Point)、通知(Advice)、切入点(Pointcut)和织入(Weaving)。这些概念共同构成了 AOP 的基础理论[^1]。 #### 2. 动态代理机制 Spring AOP 使用两种主要的动态代理方式:JDK 动态代理和 CGLIB 字节码生成库。 - **JDK 动态代理**:适用于实现了接口的目标类。通过 `java.lang.reflect.Proxy` 创建代理实例,并利用反射机制拦截方法调用。 - **CGLIB**:当目标类未实现任何接口时使用。通过对字节码操作创建子类的方式完成代理功能[^2]。 #### 3. 切入点匹配过程 在初始化 Bean 过程中,Spring 容器会执行一系列后置处理器(BeanPostProcessor),其中就包含了针对 AOP 配置的应用处理阶段——即 `applyBeanPostProcessorsAfterInitialization` 方法被调用的时间节点上完成了对符合条件的对象进行代理包装的操作[^3]。 #### 4. Advice 类型及其实现细节 不同的 Advice 对应着不同类型的增强逻辑: - Before advice (`@Before`) : 在方法执行前运行; - After returning advice(`@AfterReturning`) :仅当方法成功返回之后触发; - Around advice(`@Around`) :环绕整个方法调用周期,在此可以自定义控制流程甚至完全替换原方法的行为; - Throws advice(`@AfterThrowing`) :捕获异常发生后的响应动作; 具体来说,围绕某个特定 Joinpoint 执行额外代码片段的过程由 Advisor 和 Interceptor 来管理。Advisor 将 Pointcuts 与 Advices 结合起来形成具体的规则集,而 MethodInterceptor 接口则提供了统一的方式来描述如何干预实际方法调用。 #### 5. 示例配置文件说明 下面展示了一个典型的 Spring Boot 应用程序中有关数据访问层的日志记录需求场景下的 properties 文件设置示例[^4]: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/ecommerce spring.datasource.username=root spring.datasource.password=password spring.jpa.hibernate.ddl-auto=update spring.main.allow-bean-definition-overriding=true logging.level.root=INFO ``` 以上内容展示了数据库连接参数以及其他全局日志级别调整等内容项是如何指定给应用环境变量使用的案例之一部分而已并非全部列举出来供参考学习之目的所设也。 ### 总结 综上所述,Spring AOP 的核心在于通过代理机制实现了面向切面编程的能力,使得开发者能够在不影响现有业务逻辑的前提下加入新的功能性扩展.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值