spring的后置处理器
spring供给了三种后置处理器
BeanFactoryPostProcessor
BeanPostProcessor
-
InitializingBean
咱们来依次看每个后置处理器的履行流程。
BeanFactoryPostProcessor
首要仍是回到refresh办法中,咱们能够看到在创立一般bean方针的上面有个办法叫invokeBeanFactoryPostProcessor,从办法名就能够看出是履行BeanFactoryPostProcessor办法
办法内部调用了一个署理类的静态办法
办法内部会首要拿出完结了PriorityOrdered
接口的方针排序后履行
履行完PriorityOrdered
接口后再拿出完结了Order
接口的方针履行
最终把剩余的BeanFactoryPostProcessor依据类名排序后调用办法,这时候容器里边仍是没有方针的,在getBean的时候需求走本来看过的创立一般bean的流程
前面的都是履行的BeanDefinitionRegistryPostProcessor
的办法postProcessBeanDefinitionRegistry
,三个判别完毕之后最终履行BeanFactoryPostProcessor
的postProcessBeanFactory
办法
流程图如下
工厂后置增强的实际用途
咱们现在知道了spring供给了一些工厂的后置处理器来增强工厂,那么咱们现在来看看spring中实际使用工厂后置处理器做了什么事情,咱们来看一个类ConfigurationClassPostProcessor
这个类是用于处理写了@Configuratioin
注解的类
排序好之后就在一个循环里边解析容器里边的类
在办法中先判别是不是需求越过,假如写了@Conditional
注解的方针会判别条件是否收效
真正解析配置类的办法里边便是各种判别注解的状况,然后去做相应的办法
BeanPostProcessor 注册
工厂的增强至此就完毕了,接下来看看一般组件的后置处理器的逻辑,仍是回到refresh办法,这次是调用registerBeanPostProcessors
办法,注册后置处理器。
注册的逻辑跟BeanFactory都是由同一个署理类来完结的
大部分逻辑和bean工厂的逻辑共同,都是判别优先级接口的就先履行
跟bean工厂不共同的是,bean工厂的后置处理器直接履行方针办法,这儿仅仅把bean后置处理器创立好之后就放入list中
InstantiationAwareBeanPostProcessor
一切的BeanPostProcessor都被注册之后,咱们来看其间一个分支:InstantiationAwareBeanPostProcessor
的流程
SmartInstantiationAwareBeanPostProcessor
从名字上能够看出叫智能的
实例后置处理器,那么这个咱们就来看看智能在什么地方. 在refresh办法中调用了一个注册监听器的办法
在该办法中调用了一个依据类型获取称号列表
的办法,该办法是ListableBeanFactory
接口的一个办法
为了取得方针类的称号,spring遍历一切的bean的称号,一个一个判别
判别逻辑是先判别现已初始化好的实例,然后再判别bean界说信息,假如都没有则让他人来判别 拿到容器中的SmartInstantiationAwareBeanPostProcessor然后把类名和bean称号穿进去,让完结类来决议 总结流程图 所以咱们知道,在spring中,依据类型来找称号其实spring需求遍历一切方针,是一件很费事的事情
InstantiationAwareBeanPostProcessor
在spring容器创立方针之前,会先调用 InstantiationAwareBeanPostProcessor的 postProcessBeforeInstantiation
办法测验回来方针,假如用户回来了则会用用户创立的方针。
假如没有则调用doCreateBean办法,办法内也会从一个缓存中获取,没有的话就持续调用办法创立
创立逻辑会让用户回来一个结构函数,留意这儿调用的是SmartInstantiationAwareBeanPostProcessor的一个办法,假如没有就用默许的无参结构函数,之后便是上面写过的用东西类创立的方式
MergedBeanDefinitionPostProcessor
在创立好bean实例方针之后会调用一下MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition办法让用户界说一下BeanDefinition
PopulateBean
之后就进入特点赋值办法,首要会先履行 InstantiationAwareBeanPostProcessor
的 postProcessAfterInstantiation办法,回来bool类型的值,假如回来true则会持续特点赋值,回来false则不会特点赋值
假如回来true则开端履行InstantiationAwareBeanPostProcessor
的 postProcessProperties办法。主动注入 AutowiredAnnotationBeanPostProcessor
的该办法就完结了主动注入的特点赋值
PropertyValues
在上面咱们能够看到postProcessProperties办法回来了一个pvs,咱们也能够自界说回来pvs,spring最终会帮咱们注入到方针中,创立一个PVS回来即可
BeanPostProcessor
特点赋值之后spring会履行initializeBean
办法初始化bean,首要会先履行一些 Aware
的注入
- BeanNameAware
- BeanClassLoaderAware
- BeanFactoryAware
初始化的流程如下
postProcessBeforeInitialization
办法在调用初始化办法之前履行,让用户能够不断的包装方针
,有一个回来了null,则完毕循环 回来方针之后就履行初始化办法,InitializingBean
的办法便是在这儿被触发 履行完初始化办法之后,spring会调用postProcessBeforeInitialization
的另一个生命周期办法,同样也是让用户能够包装几层