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);
      }
   }
}
相关推荐
沐浴露z3 分钟前
一篇文章详解Kafka Broker
java·分布式·kafka
Nero185 分钟前
代码随想录二刷第二十一天 | 222.完全二叉树的节点个数、110.平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和、513.找树左下角的值
java
扶苏-su8 分钟前
Java---StringBuilder
java·开发语言
我来整一篇10 分钟前
[java] JVM 内存泄漏分析案例
java·开发语言·jvm
程序员鱼皮23 分钟前
前后端分离,千万别再搞错了!
java·前端·后端·计算机·程序员·编程·软件开发
葡萄城技术团队26 分钟前
Django 与 FastAPI 架构对比:学习路径指南
后端
golang学习记36 分钟前
Go Web 应用中的配置管理最佳实践
后端
Gu_yyqx37 分钟前
IDEA 中 Tomcat 部署 Java Web 项目
java·tomcat·maven
SimonKing37 分钟前
【开发者必备】Spring Boot 2.7.x:WebMvcConfigurer配置手册来了(五)!
java·后端·程序员
知兀42 分钟前
【Java】@Autowired警告问题,使用@RequiredArgsConstructor
java