• Spring源码阅读-ClassPathXmlApplicationContext


    第一步:new一个ClassPathXmlApplicationContext对象

    ClassPathXmlApplicationContext xmlContext = new ClassPathXmlApplicationContext("mylearn.xml");

    第二步:调用构造方法

    public ClassPathXmlApplicationContext(String configLocation) throws BeansException {
       this(new String[] {configLocation}, true, null);
    }
    
    public ClassPathXmlApplicationContext(
          String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
          throws BeansException {
    
       super(parent);
       //设置上下文的配置路径
       setConfigLocations(configLocations);
       if (refresh) {
          //刷新上下文
          refresh();
       }
    }
    public void setConfigLocations(@Nullable String... locations) {
       if (locations != null) {
          Assert.noNullElements(locations, "Config locations must not be null");
          this.configLocations = new String[locations.length];
          for (int i = 0; i < locations.length; i++) {
             this.configLocations[i] = resolvePath(locations[i]).trim();
          }
       }
       else {
          this.configLocations = null;
       }
    }
    @Override
    public void refresh() throws BeansException, IllegalStateException {
       synchronized (this.startupShutdownMonitor) {
          StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");
    
          // Prepare this context for refreshing.
          prepareRefresh();
    
          // Tell the subclass to refresh the internal bean factory.
          ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
    
          // Prepare the bean factory for use in this context.
          prepareBeanFactory(beanFactory);
    
          try {
             // Allows post-processing of the bean factory in context subclasses.
             postProcessBeanFactory(beanFactory);
    
             StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
             // Invoke factory processors registered as beans in the context.
             invokeBeanFactoryPostProcessors(beanFactory);
    
             // Register bean processors that intercept bean creation.
             registerBeanPostProcessors(beanFactory);
             beanPostProcess.end();
    
             // Initialize message source for this context.
             initMessageSource();
    
             // Initialize event multicaster for this context.
             initApplicationEventMulticaster();
    
             // Initialize other special beans in specific context subclasses.
             onRefresh();
    
             // Check for listener beans and register them.
             registerListeners();
    
             // Instantiate all remaining (non-lazy-init) singletons.
             finishBeanFactoryInitialization(beanFactory);
    
             // Last step: publish corresponding event.
             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();
             contextRefresh.end();
          }
       }
    }

    第三步:调用抽象父类AbstractXmlApplicationContext

    public AbstractXmlApplicationContext(@Nullable ApplicationContext parent) {
       super(parent);
    }

    第四步:调用抽象父类AbstractRefreshableConfigApplicationContext

    public AbstractRefreshableConfigApplicationContext(@Nullable ApplicationContext parent) {
       super(parent);
    }

    第五步:调用抽象父类AbstractRefreshableApplicationContext

    public AbstractRefreshableConfigApplicationContext(@Nullable ApplicationContext parent) {
       super(parent);
    }

    第六步:调用抽象父类AbstractApplicationContext

    public AbstractApplicationContext(@Nullable ApplicationContext parent) {
       this();
       setParent(parent);
    }
    public AbstractApplicationContext() {
       this.resourcePatternResolver = getResourcePatternResolver();
    }

    获取接口解析器 ResourcePatternResolver

    protected ResourcePatternResolver getResourcePatternResolver() {
       return new PathMatchingResourcePatternResolver(this);
    }

    第七步:设置应用上下文接口ApplicationContext

    @Override
    public void setParent(@Nullable ApplicationContext parent) {
       this.parent = parent;
       if (parent != null) {
          Environment parentEnvironment = parent.getEnvironment();
          if (parentEnvironment instanceof ConfigurableEnvironment) {
             getEnvironment().merge((ConfigurableEnvironment) parentEnvironment);
          }
       }
    }

  • 相关阅读:
    osg四元数详解
    C# 术语
    java集合总结
    vue实现大屏适配方案 (lib-flexible和postcss-px2rem-exclude)
    用户促活留存新方式——在APP中嵌入小游戏
    【BurpSuite】插件开发学习之J2EEScan(下)-主动扫描(21-30)
    Python学习基础笔记六十五——布尔值
    k8s的资源管理
    【安卓13-Framework】SystemUI定制之屏蔽下拉状态栏部分快捷按钮
    vue-springboot 前后端传参的形式
  • 原文地址:https://blog.csdn.net/weixin_39059334/article/details/134321887