BeanPostProcessor 是什么,有什么作用,为什么要知道它
spring的扩展点之一,bean后置处理器,在spring管理bean的过程中,这些后置处理器 可以干预bean的实例化前后,初始化前后,如果知道并且熟悉它,就可以干扰spring对这些bean的实例化,初始化,对spring进行扩展。 在spring对bean的实例化,初始化,这些后置处理器无处不在
1.InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
调用链:
AbstractAutowireCapableBeanFactory#createBean->
AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation->
AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInstantiation->
InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
作用
如果返回不为空的对象,就直接返回给spring容器,不走下面的容器,我们可以利用这个扩展点,对bean进行包装,代理,让这个bean完成特定的功能 如果这个扩展点真的返回不为空的对象之后还会调用BeanPostProcessor#postProcessAfterInitialization 对bean进行初始化。
2.SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors
调用链
AbstractAutowireCapableBeanFactory#doCreateBean->
AbstractAutowireCapableBeanFactory#createBeanInstance->
AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors->
SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors
作用
判断对象实例化的时候要选哪个构造方法,比如有一个无参构造,一个有参怎么选 一个没有注解,一个注解@Autowire或者@value
3.MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
调用链
AbstractAutowireCapableBeanFactory#doCreateBean->
AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors->
MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
作用
在填充bean属性之前,先把需要填充的属性缓存下来,或者在bean初始化之前,先把初始化的信息缓存下来,dubbo就是扩展了这个后置处理器,所以如果在类上@reference 就可以被自动注入,AnnotationInjectedBeanPostProcessor 这个是dubbo进行扩展实现类
4.SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference
调用链
AbstractAutowireCapableBeanFactory#doCreateBean->
AbstractAutowireCapableBeanFactory#getEarlyBeanReference->
SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference
作用
spring aop 有用到,会判断是否需要加入切面增强,也就需不需要被aop代理,如果不需要就放到一个map里面,后面的流程有用到(这个一知半解,还需要去看源码)
5.InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
调用链
AbstractAutowireCapableBeanFactory#doCreateBean->
AbstractAutowireCapableBeanFactory#populateBean->
InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
作用
这个后置处理器的方法顾名思义,就是在bean实例化之后做的事情,做了什么事情,判断这个bean是否需要填充属性,如果需要就往下走填充属性的流程,如果不需要就return。其实看了spring的实现类,基本都是需要填充属性的
6.InstantiationAwareBeanPostProcessor#postProcessProperties #postProcessPropertyValues
调用链
AbstractAutowireCapableBeanFactory#doCreateBean->
AbstractAutowireCapableBeanFactory#populateBean->
InstantiationAwareBeanPostProcessor#postProcessProperties
或者 InstantiationAwareBeanPostProcessor#postProcessPropertyValues
作用
填充bean的属性,比如 AutowiredAnnotationBeanPostProcessor 这个后置处理器解析了 @Autowire @value @Inject 这几个注解。 CommonAnnotationBeanPostProcessor 这个后置处理器解析 @Resource 这个注解,完成依赖注入
7.BeanPostProcessor#postProcessBeforeInitialization
调用链
AbstractAutowireCapableBeanFactory#doCreateBean->
AbstractAutowireCapableBeanFactory#initializeBean->
AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization->
BeanPostProcessor#postProcessBeforeInitialization
作用
postProcessBeforeInitialization 这个后置处理器的方法,顾名思义就是在bean初始化的之前执行。 像springboot 这个类 ConfigurationPropertiesBindingPostProcessor 功能就很强大,实现了springboot 自动配置的作用,可以将springboot的配置,比如application.yml文件中的配置自动绑定到java配置类,实现自动配置。 InitDestroyAnnotationBeanPostProcessor 这个类会去执行bean的初始化方法 标有@PostConstruct 方法。
8.BeanPostProcessor#postProcessBeforeInitialization
调用链 BeanPostProcessor#postProcessAfterInitialization
AbstractAutowireCapableBeanFactory#doCreateBean->
AbstractAutowireCapableBeanFactory#initializeBean->
AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization->
BeanPostProcessor#postProcessAfterInitialization
作用
postProcessAfterInitialization 这个后置处理器的方法,顾名思义就是在bean初始化的之后执行。AbstractAutoProxyCreator,如果bean需要aop,这个会完成aop的织入,对bean进行代理,生成代理类((jdk代理或者cglib代理)