Spring AOP 全面解析
在之前的几篇文章我们已经对 Spring Ioc 有了初步的认识,了解了 Spring 容器的启动,bean的注册, 接下来我们就来学习一下Spring的另一个重要知识点AOP,关于AOP的使用, 大家可以参考Spring AOP 项目实战 如果您的项目使用的是SpringBoot,那么您也需要了解一下,SpringBoot 为什么帮我们开启了自动配置类
EnableAspectJAutoProxy
在SpringBoot 为什么帮我们开启了自动配置类中,我们只是提到了EnableAspectJAutoProxy,今天就来看看它的源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
//开始 cglib动态代理还是开启 java 的动态代理,默认是false
boolean proxyTargetClass() default false;
//指示代理应该由AOP框架公开ThreadLocal 为通过AopContext类进行检索。默认情况下为关闭,即不保证AopContext访问将正常进行
boolean exposeProxy() default false;
}EnableAspectJAutoProxy的源码很简单,但是请不要忽略一个重点,那就是@Import(AspectJAutoProxyRegistrar.class),如果您对@Import 不是很熟悉,可以参考Spring@Import详解与使用
AspectJAutoProxyRegistrar
registerAspectJAnnotationAutoProxyCreatorIfNecessary
首先我们看一下registerAspectJAnnotationAutoProxyCreatorIfNecessary这个方法,他最终调用方法是如下 如果您对 BeanDefinition 不了解,可以阅读Spring BeanDefinition 详解
而注册的 bean 到底是什么呢?在 registerOrEscalateApcAsRequired 方法前,我们是不是丢了什么? 当我们在追溯的时候发现,其实是先执行了registerAspectJAnnotationAutoProxyCreatorIfNecessary,并在这里将AnnotationAwareAspectJAutoProxyCreator 进行了注册;
AnnotationAwareAspectJAutoProxyCreator

从类图是可以大致了解AnnotationAwareAspectJAutoProxyCreator这个类的功能.它实现了一系列Aware的接口, 在Bean装载的时候获取BeanFactory(Bean容器),Bean的ClassLoader,还实现了order接口,继承了PorxyConfig,ProxyConfig中主要封装了代理的通用处理逻辑, 比如设置目标类,设置使用cglib还是java proxy等一些基础配置.
而能够让这个类参与到bean初始化功能,并为bean添加代理功能的还是因为它实现了BeanPostProcessor这个接口. 这个接口的postProcessAfterInitialization方法会在bean初始化结束后(赋值完成)被调用。
这里先看一下最顶部的抽象类:AbstractAutoProxyCreator,这个抽象类主要抽象了实现代理的逻辑:
创建proxy过程分析
getProxy
JdkDynamicAopProxy
由于其实现了 InvocationHandler 必然会走,invoke
依次遍历拦截器链的每个元素,然后调用其实现,将真正调用工作委托给各个增强器
总结: 纵观以上过程可知:实际就是为bean创建一个proxy,JDKproxy或者CGLIBproxy,然后在调用bean的方法时,会通过proxy来调用bean方法
重点过程可分为:
1)将AnnotationAwareAspectJAutoProxyCreator注册到Spring容器中
2)AnnotationAwareAspectJAutoProxyCreator类的postProcessAfterInitialization()方法将所有有advice的bean重新包装成proxy
3)调用bean方法时通过proxy来调用,proxy依次调用增强器的相关方法,来实现方法切

Last updated
Was this helpful?