AOP源码解析---Spring源码从入门到精通(十九)
Posted 后端从入门到精通
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AOP源码解析---Spring源码从入门到精通(十九)相关的知识,希望对你有一定的参考价值。
上篇文章主要讲了AOP的@EnableAspectAutoProxy注解,里面导入的类和执行的后置处理器:
阅读本篇文章,一定要先阅读上篇文章,运行的源码是基于上篇文章的代码,才方便理解,如果跳着阅读,感觉内容生涩,概不负责。
1、首先传入配置类到annocationConfigApplicationContext,创建ioc容器。
2、之后注册配置类,调用refresh(),刷新容器。
3、registerBeanPostProcessor方法注册bean后置处理器,来拦截bean的创建。
1)、先按类型获取ioc容器中beanPostProcessor所有的组件。
2)、给容器中加别的BeanPostProcessor。
3)、优先注册实现PriorityOrdered接口的BeanPostProcessor。
4)、next给容器中注册实现ordered接口的beanPostProcessor。
5)、注册没实现优先级接口的BeanPostProcessor。
6)、注册BeanPostProcessor,就是创建此对象,放入IOC容器。
那么如何创建internalAutoProxyCreator类型的对象[AnnotationAwareAspectJAutoProxyCreator]?
创建bean的实例。
Populate()bean填充赋值。
Initializetion初始化bean(流程):
invokeAwareMethods调用aware方法,处理实现aware接口的方法回调。
applyBeanPostProcessorBeforeInitialazation方法里的postProcessBeforeInitialization,后置处理器的调用。
invokeInitMethods执行初始化方法。(@Bean注解指定初始化类)
applyBeanPostProcessorAfterInitialazation方法里的postProcessAfterInitialization,后置处理器的调用。
beanPostProcessor(例子:AnnotationAwareAspectJAutoProxyCreator)创建成功。
7)、吧BeanPostProcessor注册到BeanFactory中。
debugger代码可以看到:
一、下图可以看到,AnnocationConfigApplicationContext调用refresh()刷新。
二、点进去之后,有registerBeanPostProcessors方法,从注解可以看到,是注册组件后置处理器,拦截组件创建。
三、点进registerBeanPostProcessors方法,通过类型getBeanNamesForType获取到了internalAutoProxyCreator,这个组件就是在@EnableAspectJAutoProxy注解的,里面AspectJAutoProxyRegietrar类创建的组件。通过internalAutoProxyCreator定义信息,创建AnnotationAwareAspectJAutoProxyCreator组件。
四、然后用addBeanPostProcessor添加后置处理器。
五、下面建立了两个beanPsotProcessor的list集合,从注解可以看到,分离separate分别继承了PriorityOrdered,ordered,和the rest的组件。
六、吧前面的list遍历,用beanFactory.getBean获取bean。
七、点进去之后可以看到createBean方法,是不是很熟悉,之前文章讲的bean生命周期就是调用这个方法。
八、 点进doCreateBean方法,可以看到调用populate填充赋值beanPostProcess,之后再调用initializaebean方法。
九、点进去可以看到invokeAwareMethods,调用aware方法。
分别在invokeInitMethods初始化bean之前,调用postProcessBeforeInitialization方法,和初始化之后调用postProcessAfterInitialization方法,里面都是循环ioc容器里beanPostProcessrs,存在则后置处理器则调用,若为null,则直接返回。
十、invokeAwareMethods里面可以看到,判断当前bean是否是实现了aware,根据实现的不同,setBeanFactory,这时候就开始调用setBeanFactory。
十一、super调用父类的setBeanFactory,到了这一步,就到了我们 上篇文章说的setBeanFactory类这里。以上是关于AOP源码解析---Spring源码从入门到精通(十九)的主要内容,如果未能解决你的问题,请参考以下文章
Flink从入门到精通100篇(二十四)-对Flink SQL Client 源码做深度解析
Spring 从入门到精通系列 10—— 使用 Spring 进行面向切面编程(AOP)
曹工说Spring Boot源码(16)-- Spring从xml文件里到底得到了什么(aop:config完整解析上)