Spring源码学习⑪-扩展原理BeanFactoryPostP

2019-05-19  本文已影响0人  曾慧婷

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)、在初始化创建其他组件前面执行

上一篇 下一篇

猜你喜欢

热点阅读