spring的后置处理器

spring供给了三种后置处理器

  1. BeanFactoryPostProcessor
  2. BeanPostProcessor
  3. InitializingBean 咱们来依次看每个后置处理器的履行流程。

BeanFactoryPostProcessor

首要仍是回到refresh办法中,咱们能够看到在创立一般bean方针的上面有个办法叫invokeBeanFactoryPostProcessor,从办法名就能够看出是履行BeanFactoryPostProcessor办法

spring 的后置处理器
办法内部调用了一个署理类的静态办法
spring 的后置处理器
办法内部会首要拿出完结了PriorityOrdered接口的方针排序后履行
spring 的后置处理器

spring 的后置处理器
履行完PriorityOrdered接口后再拿出完结了Order接口的方针履行
spring 的后置处理器
最终把剩余的BeanFactoryPostProcessor依据类名排序后调用办法,这时候容器里边仍是没有方针的,在getBean的时候需求走本来看过的创立一般bean的流程
spring 的后置处理器
前面的都是履行的BeanDefinitionRegistryPostProcessor的办法postProcessBeanDefinitionRegistry,三个判别完毕之后最终履行BeanFactoryPostProcessorpostProcessBeanFactory办法 流程图如下

spring 的后置处理器

工厂后置增强的实际用途

咱们现在知道了spring供给了一些工厂的后置处理器来增强工厂,那么咱们现在来看看spring中实际使用工厂后置处理器做了什么事情,咱们来看一个类ConfigurationClassPostProcessor

spring 的后置处理器
这个类是用于处理写了@Configuratioin注解的类
spring 的后置处理器
排序好之后就在一个循环里边解析容器里边的类
spring 的后置处理器
在办法中先判别是不是需求越过,假如写了@Conditional注解的方针会判别条件是否收效
spring 的后置处理器
真正解析配置类的办法里边便是各种判别注解的状况,然后去做相应的办法
spring 的后置处理器

BeanPostProcessor 注册

工厂的增强至此就完毕了,接下来看看一般组件的后置处理器的逻辑,仍是回到refresh办法,这次是调用registerBeanPostProcessors办法,注册后置处理器。

spring 的后置处理器
注册的逻辑跟BeanFactory都是由同一个署理类来完结的
spring 的后置处理器
大部分逻辑和bean工厂的逻辑共同,都是判别优先级接口的就先履行
spring 的后置处理器
跟bean工厂不共同的是,bean工厂的后置处理器直接履行方针办法,这儿仅仅把bean后置处理器创立好之后就放入list中
spring 的后置处理器

InstantiationAwareBeanPostProcessor

一切的BeanPostProcessor都被注册之后,咱们来看其间一个分支:InstantiationAwareBeanPostProcessor 的流程

SmartInstantiationAwareBeanPostProcessor

spring 的后置处理器
从名字上能够看出叫智能的实例后置处理器,那么这个咱们就来看看智能在什么地方. 在refresh办法中调用了一个注册监听器的办法
spring 的后置处理器
在该办法中调用了一个依据类型获取称号列表的办法,该办法是ListableBeanFactory接口的一个办法
spring 的后置处理器
为了取得方针类的称号,spring遍历一切的bean的称号,一个一个判别

spring 的后置处理器
判别逻辑是先判别现已初始化好的实例,然后再判别bean界说信息,假如都没有则让他人来判别
spring 的后置处理器
拿到容器中的SmartInstantiationAwareBeanPostProcessor然后把类名和bean称号穿进去,让完结类来决议
spring 的后置处理器
总结流程图
spring 的后置处理器
所以咱们知道,在spring中,依据类型来找称号其实spring需求遍历一切方针,是一件很费事的事情

InstantiationAwareBeanPostProcessor

spring 的后置处理器
在spring容器创立方针之前,会先调用 InstantiationAwareBeanPostProcessor的 postProcessBeforeInstantiation办法测验回来方针,假如用户回来了则会用用户创立的方针。
spring 的后置处理器
假如没有则调用doCreateBean办法,办法内也会从一个缓存中获取,没有的话就持续调用办法创立
spring 的后置处理器
创立逻辑会让用户回来一个结构函数,留意这儿调用的是SmartInstantiationAwareBeanPostProcessor的一个办法,假如没有就用默许的无参结构函数,之后便是上面写过的用东西类创立的方式
spring 的后置处理器

MergedBeanDefinitionPostProcessor

在创立好bean实例方针之后会调用一下MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition办法让用户界说一下BeanDefinition

spring 的后置处理器

PopulateBean

之后就进入特点赋值办法,首要会先履行 InstantiationAwareBeanPostProcessorpostProcessAfterInstantiation办法,回来bool类型的值,假如回来true则会持续特点赋值,回来false则不会特点赋值

spring 的后置处理器
假如回来true则开端履行InstantiationAwareBeanPostProcessorpostProcessProperties办法。主动注入 AutowiredAnnotationBeanPostProcessor的该办法就完结了主动注入的特点赋值
spring 的后置处理器

PropertyValues

在上面咱们能够看到postProcessProperties办法回来了一个pvs,咱们也能够自界说回来pvs,spring最终会帮咱们注入到方针中,创立一个PVS回来即可

spring 的后置处理器

BeanPostProcessor

特点赋值之后spring会履行initializeBean 办法初始化bean,首要会先履行一些 Aware的注入

  1. BeanNameAware
  2. BeanClassLoaderAware
  3. BeanFactoryAware
    spring 的后置处理器
    初始化的流程如下
    spring 的后置处理器
    postProcessBeforeInitialization办法在调用初始化办法之前履行,让用户能够不断的包装方针,有一个回来了null,则完毕循环
    spring 的后置处理器
    回来方针之后就履行初始化办法,InitializingBean的办法便是在这儿被触发
    spring 的后置处理器
    履行完初始化办法之后,spring会调用postProcessBeforeInitialization的另一个生命周期办法,同样也是让用户能够包装几层