1、BeanFactoryPostProcessor:BeanFactory的后置处理器
BeanPostProcessor:Bean的后置处理器,是在bean创建对象初始化前后进行拦截工作用的。
BeanFactoryPostProcessor:BeanFactory的后置处理器,在BeanFactory标准初始化之后调用,也就是在所有bean定义已经保存并加载到BeanFactory,但是bena实例尚未创建的时候。
原理:
1)、IOC容器创建对象
2)、invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor
这里通过分析两个问题来理解:
1)、通过上面我们知道了,BeanFactoryPostProcessor是所有bean定义已经保存加载但实 例尚未创建时,那么我们自定义的MyBeanFacotyPostProcessor实例是什么时候创建, 然后在后面使用的呢?
invokeBeanFactoryPostProcessors(beanFactory);
=》
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
在这个方法里面,利用ConfigurationClassPostProcessor注册并实例 化MyBeanFacotyPostProcessor的。
ConfigurationClassPostProcessor:这个类是我们在使用@Configuration或 者@ComponentScan("com.atguigu.ext")注解时自动注册实例化的,再或者我们在 自定义BeanFactoryPostProcessor的时候进行注册实例化。可以用来实例 化BeanFactoryPostProcessor。(目前自己知道的一个作用,应该还有其他作 用,理解比较片面)
该后置处理器的执行时机:在配置类中定义的任何一个方法的bean定义注册之后, 任何BeanFactoryPostProcessor执行之前。
2)、如何找到所有的BeanFactoryPostProcessor并执行其方法呢?
=》
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
因为有步骤1),所以我们执行到该处时,只要我们将自定的 BeanFactoryPostProcessor注册到容器中,在这里就可以根据类型获取到。
1)、直接在BeanFactory中找到所有对象类型是BeanFactoryPostProcessor的 组件,并执行他们的方法。
2)、在初始化创建其他组件前面执行
网友评论