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);
      }
   }
}
相关推荐
吠品15 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘15 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
用户693717500138415 小时前
从代码生产者到 AI 协作者:软件工程师的角色重构
android·前端·后端
Java内核笔记15 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端
糖果店的幽灵16 小时前
langgraph的 MessagesState 解读
java·开发语言·人工智能·windows·langgraph
码栈研说16 小时前
Go 语言大白话入门 10 - 排序与常用数据操作
后端·程序员
JavaGuide16 小时前
再见 Superpowers!很多 Skill 真的可以扔掉了。
后端·ai编程
极光代码工作室17 小时前
基于SpringBoot的在线博客系统
java·springboot·web开发·后端开发
我是唐青枫17 小时前
Java Spring Security 实战详解:从登录认证到 JWT 权限控制
java·spring
用户77139702070617 小时前
我在项目里发现了一个“神秘文件“——.editorconfig
后端