spring AbstarctApplicationContext类中refresh代码分析

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】
免费领取10G资料包与项目实战视频资料

Spring容器启动的整个过程实际上就包含在AbstractApplicationContext的refresh方法中

    public void refresh() throws BeansException, IllegalStateException {
            synchronized (this.startupShutdownMonitor) {

                /** 这里会重新设置容器启动时间和启动标志字段*/
                prepareRefresh();

                /**
                 * 通知子类刷新beanFactory,具体实现在 AbstractRefreshableApplicationContext中,
                 * 1.如果当前Context持有beanFactory,则先destoryBeans,再关闭beanFactory
                 * 2.createBeanFactory:用父容器创建一个DefaultListableBeanFactory,(这里如果父容器为ConfigurableApplicationContext,
                 * 则返回该context持有的beanFacotry,否则直接返回父BeanFactory。ps:这里可能就是context和beanFactory的区分点)
                 * 3.customizeBeanFactory:根据参数设置是否允许子类定制DefaultListableBeanFactory。
                 * 4.loadBeanDefinitions:加载BeanDefinitions,具体实现在AbstractXmlApplicationContext中。(TODO:后面会详细扩展讲解)
                 * 并返回子类的beanFactory
                 */
                ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

                /**
                 * 这个方法主要是为后面实例化bean做一些设置 
                 * 1.设置ClassLoader 
                 * 2.addPropertyEditorRegistrar,设置用户定义的propertyEditor注册器
                 * 3.addBeanPostProcessor,设置ApplicationContextAwareProcessor, 处理ApplicationContextAware实现接口的Bean。
                 * 4.ignoreDependencyInterface,设置不解析某些接口的依赖关系 
                 * 5.registerResolvableDependency,设置特殊接口和bean的绑定关系
                 */
                prepareBeanFactory(beanFactory);

                try {

                    /** 提供接口给子类修改beanFactory。 */
                    postProcessBeanFactory(beanFactory);

                    /** 调用注册的BeanFactoryPostProcessor,按照实现的排序接口PriorityOrdered>Ordered>无接口 */
                    invokeBeanFactoryPostProcessors(beanFactory);

                    /** 按照排序接口,依次注册BeanPostProcessor,后面会按照这个顺序调用 */
                    registerBeanPostProcessors(beanFactory);

                    /**
                     * 初始化messageSource,(MessageSource接口用于支持国际化)如果context中尤定义id为messageSource
                     * 的MessageSource接口的bean(潜规则),则采用它来解析Message资源,否则采用父容器messageSource,这里会创建一个DelegatingMessageSource,
                     * 避免为空的情况导致调用失败。
                     */
                    initMessageSource();

                    /**
                     * 初始化并注册ApplicationEventMulticaster,容器事情广播器,同样采用MessageSource类似的潜规则,
                     * 如果容器中有名为applicationEventMulticaster且实现了ApplicationEventMulticaster接口的bean,则注册它,
                     * 否则创建SimpleApplicationEventMulticaster,将它当作默认的广播器。
                     */
                    initApplicationEventMulticaster();

                    /** 给子类保留的接口,通知子类刷新 */
                    onRefresh();

                    /** 获取容器中定义的所有ApplicationListener,容器事件监听器,并注册 */
                    registerListeners();

                    /**
                     * 1.清除用于类型匹配的classLoader 
                     * 2.冻结bean definitions中设置,不能再修改bean的配置
                     * 3.实例化非延迟加载的单例bean,包括由FactoryBean实例化的bean(TODO:需要进一步深挖)
                     */
                    finishBeanFactoryInitialization(beanFactory);

                    /** 广播ContextRefreshedEvent容器刷新事件。 */
                    finishRefresh();
                }

                catch (BeansException ex) {
                    // Destroy already created singletons to avoid dangling resources.
                    beanFactory.destroySingletons();

                    // Reset 'active' flag.
                    cancelRefresh(ex);

                    // Propagate exception to caller.
                    throw ex;
                }
            }
        }

来源:http://ddrv.cn/a/88268

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » spring AbstarctApplicationContext类中refresh代码分析

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏