zoukankan      html  css  js  c++  java
  • Spring容器基础ClassPathXmlApplicationContext(一起看源码)

    ApplicationContext相比较于BeanFactory,扩展了很多功能。也就是说前者包含了后者的所有功能。使用前者加载XML的方式:ApplicationContext app=new ClassPathXmlApplicationContext("applicationContextIOC.xml");下面对此代码进行分析,追踪源码如下所示:

    参数是Spring配置文件的路径,方法里再次调用其构造方法,如下:

     其中,setConfigLocations该方法主要解析给定的路径数组,如下源码:

    设置路径之后,就可以对配置文件的解析以及各种功能的实现了。最重要的方法就是refresh方法,该方法的源码如下:

    @Override
        public void refresh() throws BeansException, IllegalStateException {
            synchronized (this.startupShutdownMonitor) {
                // 刷新上下文环境
                prepareRefresh();
    
                // 初始化BeanFactory,进行xml文件读取
                ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
    
                // 对BeanFactory进行各种功能的填充
                prepareBeanFactory(beanFactory);
    
                try {
                    // 子类覆盖方法做其他的处理
                    postProcessBeanFactory(beanFactory);
    
                    // 激活BeanFactory的处理器
                    invokeBeanFactoryPostProcessors(beanFactory);
    
                    // 注册拦截Bean创建的Bean处理器
                    registerBeanPostProcessors(beanFactory);
    
                    // 为上下文初始化Message源
                    initMessageSource();
    
                    // 初始化应用消息广播器
                    initApplicationEventMulticaster();
    
                    // 留给子类初始化其他的bean
                    onRefresh();
    
                    // 查找Listeners bean,注册到消息广播器中
                    registerListeners();
    
                    // 初始化剩下的单实例
                    finishBeanFactoryInitialization(beanFactory);
    
                    // 完成刷新过程,通知生命周期处理器
                    finishRefresh();
                }
    
                catch (BeansException ex) {
                    if (logger.isWarnEnabled()) {
                        logger.warn("Exception encountered during context initialization - " +
                                "cancelling refresh attempt: " + ex);
                    }
    
                    // Destroy already created singletons to avoid dangling resources.
                    destroyBeans();
    
                    // Reset 'active' flag.
                    cancelRefresh(ex);
    
                    // Propagate exception to caller.
                    throw ex;
                }
    
                finally {
                    // Reset common introspection caches in Spring's core, since we
                    // might not ever need metadata for singleton beans anymore...
                    resetCommonCaches();
                }
            }
        }

    由以上源码可以清晰的看出整个执行流程,至于每部操作还需要花时间去理解。

  • 相关阅读:
    USACO Milk2 区间合并
    Codeforces 490B Queue【模拟】
    HDU 3974 Assign the task 简单搜索
    HDU 5119 Happy Matt Friends(2014北京区域赛现场赛H题 裸背包DP)
    Cin、Cout 加快效率方法
    POJ 1159 回文LCS滚动数组优化
    POJ 2479 不相交最大子段和
    POJ 1458 最长公共子序列 LCS
    在阿里最深刻的,还是职场之道给我的震撼
    精细化
  • 原文地址:https://www.cnblogs.com/lichangyun/p/10713087.html
Copyright © 2011-2022 走看看