什么是AOP?
AOP是一种编程范式,旨在通过允许分离横切关注点来增加模块化。他通过在不修改代码本身的情况下向现有代码添加额外的行为来实现这一点。
相反,我们可以分别声明新方法和新行为。Spring的AOP框架帮助我们实现这些横切关注点。
注意:本文是以5.2.3版本为讲解。
步骤一:AutowireCapableBeanFactory类对容器生成的Bean添加后置处理器
在前两篇关于“DI”的文章中,我们讲到Spring对Bean属性通过“populateBean()”方法是如何进行依赖注入的,今天我们讲解通过“initializeBean()”方法是如何为Bean实例应用BeanPostProcessor后置处理器。
步骤二:为Bean实例对象添加BeanPostProcessor后置处理器的入口
初始化给定的bean实例,应用工厂回调以及init方法和beanPostProcessor后置处理器。从createBean调用定义的bean,从initializeBean调用现有bean实例。大致业务如下:
-
invokeAwareMethods:为Bean实例包装相关属性,如:bean名称、Bean类加载器、bean工厂等。
-
applyBeanPostProcessorsBeforeInitialization:将 BeanPostProcessors 应用于给定的现有 bean 实例,调用它们的 postProcessBeforeInitialization 方法。返回的 bean 实例可能是当前bean的包装后的bean。
-
invokeInitMethods:执行初始化的方法,如果当前bean实现了InitializingBean接口就调用afterPropertiesSet()方法,如果是init-method属性,就调用指定的方法
-
applyBeanPostProcessorsAfterInitialization:将 BeanPostProcessors 应用于给定的现有 bean 实例,调用它们的 postProcessAfterInitialization 方法。返回的 bean 实例可能是当前bean的包装后的bean。
步骤三:调用BeanPostProcessor后置处理器实例对象初始化之前的处理方法
循环遍历获取所有的BeanPostProcessor后置处理器,调用所有的初始化前的处理方法
步骤四:调用BeanPostProcessor后置处理器实例对象初始化之后的处理方法
循环遍历获取所有的BeanPostProcessor后置处理器,调用所有的初始化后的处理方法
BeanPostProcessor有很多实现的子类,分别有不同的功能,而其中创建AOP代理对象的子类“AbstractAutoProxyCreator”,在这里我们继续分析该类的postProcessAfterInitialization方法。
步骤五:选择代理策略
大致业务如下:
-
判断当前是否需要代理(即Advice类、Pointcut类、Advisor类、AopInfrastructureBean类),如果不需要,返回当前bean实例
-
getAdvicesAndAdvisorsForBean:获取这个bean的advice集合
-
createProxy:创建代理
步骤六:获取这个bean的advice集合
步骤七:创建AOP代理
大致业务如下:
-
buldAdvisors:确定给定bean的Advisor,包括特定的拦截器和公共拦截器,所有这些都适合Advisor接口。
-
getProxy:获取指定的代理
步骤八:根据工厂的设置获取代理
proxyFactory有JDK和CGLIB的,最终调用的是DefaultAopProxyFactory类的createAopProxy()方法
步骤九:为给定的AOP配置创建一个AopProxy
在这个方法里我们根据不同策略是使用JDK和CGLIB的代理。
时序图
写在最后
好兄弟可以点赞并关注我的公众号“javaAnswer”,全部都是干货。