Spring源码--AbstractApplicationContext的refresh()方法

一. 先上源码为敬
   

public void refresh() throws BeansException, IllegalStateException {
            //刷新前的预处理
            prepareRefresh();

            // 获取BeanFactory
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

            // BeanFactory的预准备工作(BeanFactory进行一些设置)
            prepareBeanFactory(beanFactory);
           // BeanFactory准备工作完成后进行的后置处理工作,子类通过重写这个方法来在BeanFactory创建并预准备完成以后               做进一步的设置
            postProcessBeanFactory(beanFactory);

            // 执行BeanFactoryPostProcessor的后置处理方法
            invokeBeanFactoryPostProcessors(beanFactory);

            // 注册BeanPostProcessors,此时并不执行这些bean的后置处理器
            registerBeanPostProcessors(beanFactory);

             // 初始化MessageSource
             initMessageSource();

             // 初始化事件派发器
             initApplicationEventMulticaster();

             // 是一个空方法,留给容器的子类实现,子类重写这个方法,在容器刷新的时候可以自定义一些逻辑
             onRefresh();

             // 注册事件驱动
             registerListeners();

             //初始化所有剩下的单实例bean
             finishBeanFactoryInitialization(beanFactory);

             // 完成BeanFactory的初始化创建工作,IOC容器就创建完成
             finishRefresh();
    }

二.分析

1、prepareRefresh()刷新前的预处理
    1)、initPropertySources()自定义初始化一些属性设置,比如子类(继承AnnotationConfigApplicationContext)自定义的个性化的属性设置方法
    2)、getEnvironment().validateRequiredProperties():检验属性的合法等
2、obtainFreshBeanFactory()获取BeanFactory
    1)、refreshBeanFactory()创建BeanFactory实例
             * 创建了一个beanFactory:

                DefaultListableBeanFactory beanFactory = createBeanFactory();

                synchronized (this.beanFactoryMonitor) {
                         this.beanFactory = beanFactory;
                }
            * 设置序列化id:beanFactory.setSerializationId(getId());

            *  定制BeanFactory,在基本容器的基础上,增加了是否允许覆盖,是否允许扩展的设置,并提供了注解@Qualifier和                      @Autowired的支持: customizeBeanFactory(beanFactory);

           *  进行XML文件读取及解析。在这里将xml文件中的Bean对象解析为BeanDefinition类中的属性:

              loadBeanDefinitions(beanFactory);
    2)、getBeanFactory()获取刚才在AbstractRefreshableApplicationContext中创建的BeanFactory对象
    3)、将创建的BeanFactory【DefaultListableBeanFactory】返回
3、prepareBeanFactory(beanFactory);BeanFactory的预准备工作(BeanFactory进行一些设置)
    1)、设置BeanFactory的类加载器、支持表达式解析器等等
    2)、添加部分BeanPostProcessor,比如ApplicationContextAwareProcessor
    3)、设置忽略的自动装配的接口,比如EnvironmentAware、EmbeddedValueResolverAware等等
    4)、注册可以解析的自动装配,我们能直接在任何组件中自动注入这些Spring为我们提供的组建,比如:
   BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
    5)、添加BeanPostProcessor,类型为ApplicationListenerDetector
    6)、添加编译时的AspectJ
    7)、给BeanFactory中注册一些能用的组件,比如:
        id为environment,类型为ConfigurableEnvironment
        id为systemProperties,类型为Map<String, Object>
        id为systemEnvironment,类型为Map<String, Object>

4、postProcessBeanFactory(beanFactory);BeanFactory准备工作完成后进行的后置处理工作,子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步的设置

5、 invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor的后置处理方法
   BeanFactoryPostProcessor:BeanFactory的后置处理器,在BeanFactory标准初始化之后执行的两个接口:BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor
    1)、先执行BeanDefinitionRegistryPostProcessor实现类的后置处理方法
    2)、再执行BeanFactoryPostProcessor的后置处理方法

6、registerBeanPostProcessors(beanFactory);注册BeanPostProcessor(Bean的后置处理器,拦截bean的创建过程):
  beanFactory.addBeanPostProcessor(postProcessor);

     注册一个ApplicationListenerDetector,来在Bean创建完成后检查是否是ApplicationListener,如果是则先将其保存在容器中:
  applicationContext.addApplicationListener((ApplicationListener<?>) bean);

7、initMessageSource();初始化MessageSource组件(SpringMvc中做国际化功能;消息绑定,消息解析)

8、initApplicationEventMulticaster();初始化事件派发器

9、registerListeners();在容器中注册所有的ApplicationListener

    1)、从容器中拿到第三步是注册到容器中的所有的ApplicationListener
    2)、将每个监听器添加到事件派发器中:
  getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);

    3)、派发之前步骤产生的事件

10.finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例bean、

11.finishRefresh();完成BeanFactory的初始化创建工作,IOC容器就创建完成
   1)、initLifecycleProcessor();初始化和生命周期有关的后置处理器,默认从容器中找是否有lifecycleProcessor的组件          LifecycleProcessor,如果没有则: new DefaultLifecycleProcessor();并将其加入到容器,后续可以从容器中获取该bean并将其注入到其他组件中
    2)、getLifecycleProcessor().onRefresh();
拿到前面定义的生命周期处理器(BeanFactory);回调onRefresh();
    3)、publishEvent(new ContextRefreshedEvent(this));发布容器刷新完成事件
    4)、liveBeansView.registerApplicationContext(this);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值