Spring5源码分析-------Aop篇(一)

在前面的文章(点击进入)中提到了@EnableAspectJAutoProxy这个注解,也已经提到过它的核心就是@Import(AspectJAutoProxyRegistrar.class),然而我们SpringAop中最重要的类也是这个。下面我们来查看AOP核心源码
在这里插入图片描述
注解开启SpringAop
在这里插入图片描述
往IOC容器中注入SpringAOP切面类
在这里插入图片描述
注册切面类
在这里插入图片描述
在这里插入图片描述
AnnotationAwareAspectJAutoProxyCreator.class注册到容器中,AOP入口
在这里插入图片描述registry.registerBeanDefinition(“org.springframework.aop.config.internalAutoProxyCreator”, beanDefinition);
这里是不是很熟悉,第一个参数是beanName,第二个参数是bean的基本信息,我们在来看,beanDefinition这个基本信息只是被进行了封装,装入了RootBeanDefinition中,而这个对象我们前面也提到过,它是传统注入的bean对象,再往前查看,这个cls是哪个对象。
在这里插入图片描述
cls是这个类吧?(查看鼠标上一次的位置ctrl+alt+←)。好了,bean信息的收集就是这个类,现在我们来查看这个类,先查看AnnotationAwareAspectJAutoProxyCreator的类图
在这里插入图片描述
我们会发现,它的最终父类又是那么熟悉。BeanPostProcessor,我们前面也说过吧?后置处理器!!!
好了,我们在继续点开它的父类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
到达AbstractAutoProxyCreator类,这是第二个重点,这也是为什么我在类图中,会把它圈出来。
前面我们看类图的时候,也知道AbstractAutoProxyCreator是BeanPostProcessor子类吧。那么他肯定有实现前后置处理器。我们查看这个类的所有方法(Alt+7)
在这里插入图片描述
我们会看到两对前后置处理器。那么会是哪一对呢。我们在回到以前看bean周期的时候源码,找到他们的前后置处理。
(查找方法省略,可以参考文章https://blog.csdn.net/weixin_43911969/article/details/114003861)。
在这里插入图片描述
找到了他们的前后置处理器,我们点击进去看看。
分别点击进入前后置处理器
前置:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
现在我们看清楚了,走的是public Object postProcessBeforeInitialization(Object bean, String beanName)这样一个方法

后置
在这里插入图片描述
与前置处理器的选择一样,也是AbstractAutoProxyCreator,进入之后
在这里插入图片描述
好了,我们会发现前置处理器并未进行任何的逻辑处理,反而是后置处理器做的逻辑处理。那我们就从后置处理器下手。在这里,提醒一下,大家会发现,我们从bean的生命周期这里进来的类正好是我们之前拥有两对前后置处理器的类。
我们来思考一个问题,前面 提到过,动态代理,那么Aop是使用哪个动态代理的?
从后置处理器出发(毕竟前置处理器并未进行逻辑处理)
查看这个方法(wrapIfNecessary()方法判断该对象是否在AOP切入点扫包范围内。)
在这里插入图片描述
看这一部分代码
在这里插入图片描述
protected static final Object[] DO_NOT_PROXY = null;
if (specificInterceptors != DO_NOT_PROXY) 判断是否进行了增强(是否使用了通知)
Object proxy = this.createProxy(bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));如果使用了增强,就创建代理。好了,我们点击进去就知道代理的创建时利用哪种形式
在这里插入图片描述
获取代理。
在这里插入图片描述
创建代理方法。
在这里插入图片描述
在这里插入图片描述
目前我们就看到了,里面有cglib和jdk代理,所以说Aop两种代理均使用了。但是里面还有判断。
if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config))
//config.isOptimize() 是否对代理类的生成使用策略优化 其作用是和isProxyTargetClass是一样的 默认为false
//config.isProxyTargetClass() 是否使用Cglib的方式创建代理对象 默认为false
//hasNoUserSuppliedProxyInterfaces目标类是否有接口存在 且 只有一个接口的时候接口类型不是SpringProxy类型

if (targetClass.isInterface() || Proxy.isProxyClass(targetClass))
// 判断如果是接口,或者是代理的类,则使用JDK动态代理

猜你喜欢

转载自blog.csdn.net/weixin_43911969/article/details/114081856