Spring PostProcessor及IOC容器初始化流程

1,分析BeanFactoryPostProcessor与BeanDefinitionRegistryPostProcessor执行原理及时机;

接口BeanFactoryPostProcessor:beanFactory的后置处理器
    -定义了方法postProcessBeanFactory
接口BeanDefinitionRegistryPostProcessor:bean定义的后置处理器
    -定义了方法postProcessBeanDefinitionRegistry,
    -继承了接口BeanFactoryPostProcessor
        -定义了方法postProcessBeanFactory

BeanFactory:一个Bean工厂,getBean,到工厂中获取bean,就是到IOC的Map中拿Bean,拿得到就返回,拿不到就创建。
    创建的方式有很多种,有反射,cglib,动态代理增强返回一个bean。
    AnnotationConfigApplicationContext
        -GenericApplicationContext
            -AbstractApplicationContext
                -ConfigurableApplicationContext
                    -ApplicationContext
                        -ListableBeanFactory,HierarchicalBeanFactory
                            -BeanFactory
                                -getBean(String name)

FactoryBean:工厂模式,要生产一个bean,调用getObject()方法返回一个bean就行了。

BeanFactoryPostProcessor
BeanPostProcessor
    -initializeBean
        -applyBeanPostProcessorsBeforeInitialization:调用前
        -invokeInitMethods:bean初始化方法调用
        -applyBeanPostProcessorsAfterInitialization:调用后

BeanDefinitionRegistryPostProcessor
RootBeanDefinition

1.1、BeanFactoryPostProcessor的执行时机
在容器创建的时候,会先创建BeanFactory,扫描所有的Bean定义信息,加载到BeanFactory中,然后才会去创建单实例的bean,调用构造方法。
1.2、BeanDefinitionRegistryPostProcessor的执行时机
测试结果发现,实现BeanDefinitionRegistryPostProcessor接口的类的方法的执行时机在实现BeanFactoryPostProcessor接口的类的方法的执行时间之前;
实现BeanDefinitionRegistryPostProcessor接口的类中的postProcessBeanDefinitionRegistry方法的执行时机在postProcessBeanFactory方法的执行时机之前。
1.3、分别的源码处理流程图如下所示:
2,IOC容器初始化从refresh到prepareBeanFactory()源码流程如下所示。
AnnotationConfigApplicationContext:容器
    -refresh:创建刷新
        -prepareRefresh:刷新前的预处理
            -initPropertySources:初始化一些属性设置;默认为空,由子类实现;
            -getEnvironment().validateRequiredProperties():校验相关属性的合法性
            -this.earlyApplicationEvents = new LinkedHashSet<>():保存容器中的一些早期的事件
        -obtainFreshBeanFactory:获取beanFactory实例
            -refreshBeanFactory:刷新或创建beanFactory
                -public GenericApplicationContext() { this.beanFactory = new DefaultListableBeanFactory();} 构造方法创建子类
            -getBeanFactory:将刚生成的beanFactory返回
        -prepareBeanFactory:beanFactory预准备工作,(以上创建的beanFactory好多属性是没有值的,只有一些默认的值)
            -beanFactory.setBeanClassLoader;设置beanFactory的类加载器
            -beanFactory.setBeanExpressionResolver;设置beanFactory支持相关的表达式语言的解析
            -beanFactory.addBeanPostProcessor;增加后置处理器
            -beanFactory.ignoreDependencyInterface;设置忽略的自动装配接口
                -EnvironmentAware
                -EmbeddedValueResolverAware
            -beanFactory.registerResolvableDependency;注册可以解析的自动装配;我们能直接在任何组件中自动注入
                -BeanFactory
                -ApplicationContext
            -beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));添加监听检测的处理器
            -if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME));注册环境变量相关的bean
        -postProcessBeanFactory
        -invokeBeanFactoryPostProcessors:调用BeanFactoryProcessor后置处理器
            -invokeBeanFactoryPostProcessors
                -postProcessBeanDefinitionRegistry:如果有BeanDefinitionRegistryPostProcessors的话优先处理BeanDefinitionPostProceesor
                    -postProcessBeanDefinitionRegistry
                        -JamesBeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry
                -invokeBeanFactoryPostProcessors:处理BeanFactoryPostProcessors
                    -postProcessBeanFactory
                        -JamesBeanFactoryPostProcessor.postProcessBeanFactory
        -registerBeanPostProcessors
        -initMessageSource
        -initApplicationEventMulticaster
        -onRefresh
        -registerListeners
        -finishBeanFactoryInitialization
        -finishRefresh

猜你喜欢

转载自blog.csdn.net/u014653854/article/details/81173518