引入
1 | 复制代码在讲解循环依赖的解决方案之前, 我们必须要对AOP的源码有一定的了解, 因为循环依赖涉及到的二级缓存就跟 |
调用后置处理器完成AOP的初始化工作的步骤分析
从整体上分析初始化工作
一、由创建单例bean的入口代码讲起
1 | 复制代码if (mbd.isSingleton()) { |
二、由createBean引出bean的后置处理器
1 | 复制代码protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) { |
三、由resolveBeforeInstantiation方法来看看在真正创建bean之前Spring的操作
1 | 复制代码protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) { |
四、applyBeanPostProcessorsBeforeInstantiation方法调用后置处理器
1 | 复制代码protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) { |
AbstractAutoProxyCreator的postProcessBeforeInstantiation方法
一、postProcessBeforeInstantiation方法
1 | 复制代码public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) { |
二、isInfrastructureClass筛选出所有的通知类
1 | 复制代码// 调用AnnotationAwareAspectJAutoProxyCreator的isInfrastructureClass |
三、shouldSkip方法
1 | 复制代码protected boolean shouldSkip(Class<?> beanClass, String beanName) { |
findCandidateAdvisors方法分析
findCandidateAdvisors
1 | 复制代码protected List<Advisor> findCandidateAdvisors() { |
buildAspectJAdvisors方法构建程序员提供的通知
1 | 复制代码public List<Advisor> buildAspectJAdvisors() { |
小小的总结
1 | 复制代码在findCandidateAdvisors方法中, Spring对容器中所有的类进行扫描, 查找出了所有通知类及通知方法, 并 |
小小的总结
1 | 复制代码第一次调用后置处理器完成AOP的初始化工作即最终会调用InstantiationAwareBeanPostProcessor接口的 |
AOP的实现原理步骤分析
一、doCreateBean简单分析
1 | 复制代码在上面AOP初始化工作的第二步中可以看到, 调用完resolveBeforeInstantiation完成了AOP的初始化之后, 就 |
二、initializeBean方法
1 | 复制代码protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) { |
调用AbstractAutoProxyCreator的postProcessAfterInitialization方法完成AOP
postProcessAfterInitialization方法
1 | 复制代码public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) { |
wrapIfNecessary
1 | 复制代码protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) { |
getAdvicesAndAdvisorsForBean获取所有适用于当前bean的通知
1 | 复制代码protected Object[] getAdvicesAndAdvisorsForBean( |
findAdvisorsThatCanApply方法找到合适的通知
1 | 复制代码在该方法中, 有多个嵌套调用, 不太方便将代码放上来, 笔者通过文字来描述, Spring会循环所有的通知, 对 |
createProxy创建代理对象
1 | 复制代码/** |
getProxy方法创建代理对象
1 | 复制代码public Object getProxy(@Nullable ClassLoader classLoader) { |
总结
1 | 复制代码AOP源码的分析就差不多了, 我们从AOP初始化的一些配置开始讲起, 然后讲到了AOP真正的实现即BeanPostProcessor |
本文转载自: 掘金