spring在完成一个bean的初始化、实例化的过程中,会用到九个后置处理器
spring在初始化的过程中,会在九个地方分别调用了五个后置处理的九个方法
文章目录
- 1.第一次调用后置处理器
- 2.第二次调用后置处理器
- 3.第三次调用后置处理器
- 4.第四次调用后置处理器
- 5.第五次调用后置处理器
- 6.第六次调用后置处理器
- 7.第七次调用后置处理器
- 8.第八次调用后置处理器
- 9.第九次调用后置处理器
1.第一次调用后置处理器
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation
InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation
InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation
方法可以返回任何类型,如果返回的对象不为null,就调用beanPostProcessor的postProcessAfterInitialization
方法;如果返回null,就正常的执行流程;该后置处理器
在spring AOP当中,spring如果判断当前类100%不需要进行增强,会把这个bean放到一个map中,并将value置为false,那么在后面进行增强的时候,会排除这个map中的bean
2.第二次调用后置处理器
该后置处理器推断使用哪个构造函数来初始化bean对象
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors
InstantiationAwareBeanPostProcessor --> determineCandidateConstructors();推断使用哪个构造函数来初始化bean对象
在推断使用哪一个构造函数的时候,会首先判断当前构造函数是否有@Value和@Autowired注解,如果没有,那就校验当前构造方法对应的bean和传来的beanClass是否一样,如果是同一个,就把当前构造函数赋值给defaultConstructor
在第二次调用后置处理器的时候,会返回当前可用的构造函数,由此来决定,使用哪个构造函数来创建bean
3.第三次调用后置处理器
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors
MergedBeanDefinitionPostProcessor --> postProcessMergedBeanDefinition
后面生命周期流程中的某些流程缓存一些meta信息
比如:在CommonAnnotationBeanPostProcessor和AutowiredAnnotationBeanPostProcessor的postProcessorMergedBeanDefinition的方法中,会调用finAutowiringMetadata和findResourceMetadata方法,将当前bean所依赖的bean(@Autowired和@Resource注解)存到一个map中,后面在进行属性注入的时候,会先从这个map中找当前bean依赖的bean有哪些,如果map中为空,就再查找要注入的属性有哪些
再比如:在CommonAnnotationBeanPostProcessor的这个方法中,将@PostConstrct和@PreDestroy注解对应的方法,缓存起来,在后面调用初始化的后置处理器的时候,先从这里存的map中找方法,找到,就直接执行即可
这些提前缓存的操作,都是在这个后置处理器完成的
4.第四次调用后置处理器
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getEarlyBeanReference
SmartInstantiationAwareBeanPostProcessor --> getEarlyBeanReference
把创建的对象 放到earlySingletonObjects,解决循环依赖的),处理循环依赖问题会用到这个后置处理器。
这里通过后置处理器,暴露出一个ObjectFactory(个人理解是一个bean工厂),可以完成bean的实例化等操作;这里的方法不会立即执行,只有执行到objectFactory.getObject()方法的时候,才会执行。
5.第五次调用后置处理器
判断是否需要进行属性填充
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean-InstantiationAwareBeanPostProcessor–postProcessAfterInstantiation
InstantiationAwareBeanPostProcessor --> postProcessAfterInstantiation
判断是否需要填充属性。如果我们需要在程序中自己注入属性,可以利用这个点,在这里返回false,那么spring就不会调用下面这个后置处理器来注入属性
6.第六次调用后置处理器
进行属性注入
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean–InstantiationAwareBeanPostProcessor–postProcessPropertyValues
InstantiationAwareBeanPostProcessor --> postProcessPropertyValues
主要是CommonAnnotationBeanPostProcessor(用来处理@Resource注解)和AutowiredAnnotationConigApplication(处理@Autowired和@Value注解);如果是自动注入(AutowireMode不为null),是无需通过后置处理器来进行属性注入的
7.第七次调用后置处理器
执行初始化方法
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization
BeanPostProcessor --> postProcessBeforeInitialization bean
CommonAnnotationBeanPostProcessor 继承了 InitDestroyAnnotationBeanPostProcessor,在该后置处理器处理的是@postconstruct注解
8.第八次调用后置处理器
springAop
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
BeanPostProcessor --> postProcessAfterInitialization
bean初始化之后执行的方法,典型应用:对aop进行处理,对目标类生成代理对象
9.第九次调用后置处理器
在销毁bean容器的时候调用的
在调用ac.close()方法的时候,会调用该后置处理器
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor#postProcessBeforeDestruction
处理 @PreDestroy注解,destroy-method和destroy()方法