SpringBoot启动流程资源文件初始化分析

1. SpringApplication.run(StartClass.class,args);--->启动类main方法调用SpringApplication静态run方法

2. SpringApplication类中将资源文件装载到Object[] 数组中:我们传入的参数为 SpringApplication.class

public static ConfigurableApplicationContext run(Object source, String... args) {
   return run(new Object[] { source }, args);
}

3.SpringApplication类的构造器初始化sources资源文件,然后调用run(args)启动方法;

public static ConfigurableApplicationContext run(Object[] sources, String[] args) {
   return new SpringApplication(sources).run(args);//利用构造器初始化资源文件,run方法运行启动流程
}
public SpringApplication(Object... sources) {
   initialize(sources);//初始化资源文件
}
private void initialize(Object[] sources) {
   if (sources != null && sources.length > 0) {  //将数组元素赋值给sources集合
      this.sources.addAll(Arrays.asList(sources));//this.sources是一个LinkedHashSet集合
   }
   this.webEnvironment = deduceWebEnvironment();//通过是否包含 WEB_ENVIRONMENT_CLASSES 数组中的类判定是否是web应用程序(javax.servlet.Servlet,org.springframework.web.context.ConfigurableWebApplicationContext)
   setInitializers((Collection) getSpringFactoriesInstances(
         ApplicationContextInitializer.class));//初始化ApplicationContextInitializer
   setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));//初始化ApplicationListener
   this.mainApplicationClass = deduceMainApplicationClass();//获取mainApplicationClass对象实例
}

ApplicationContextInitializer初始化为7个对象集合:
0-ConfigurationWarningsApplicationContextInitializer:可以检查配置,在有常见错误配置时打印错误信息的BeanFactoryPostProcessor

1-ContextIdApplicationContextInitializer:为ApplicationContext设置Id
2-DelegatingApplicationContextInitializer:在context.initializer.classes中配置委托其他初始化器
3-ServerPortInfoApplicationContextInitializer:设置环境变量local.server.port以方便测试
4-SharedMetadataReaderFactoryContextInitializer:
5-AutoConfigurationReportLoggingInitializer:
6-RestartScopeInitializer:

ApplicationListener初始化为11个对象集合:
0-ClearCachesApplicationListener:加载上下文后清理缓存
1-ParentContextCloserApplicationListener:监听父ApplicationContext,如果父关闭,则关闭当前上下文
2-FileEncodingApplicationListener:监听系统文件编码与环境编码是否一致,不一致打印日志,启动终止
3-AnsiOutputApplicationListener:根据spring.output.ansi.enable配置ANSI输出
4-ConfigFileApplicationListener:搜索并加载配置文件,设置enviroment
5-DelegatingApplicationListener:加载并转发事件至context.listener.classes中配置的ApplicationListener
6-LiquibaseServiceLocatorApplicationListener:将liquibase.servicelocator.ServiceLocator替换成适用于springboot版本
7-ClasspathLoggingApplicationListener:程序启动日志打印,正常打印classpath到debug,失败打印到info
8-LoggingApplicationListener:根据配置在合适的时候初始化日志配置
9-BackgroundPreinitializer:
10-RestartApplicationListener:

mainApplicationClass

this.mainApplicationClass = deduceMainApplicationClass();

private Class<?> deduceMainApplicationClass() {
   try {
      StackTraceElement[] stackTrace = new RuntimeException().getStackTrace();//获取当前调用栈
      for (StackTraceElement stackTraceElement : stackTrace) {
         if ("main".equals(stackTraceElement.getMethodName())) {//找到main方法所在的启动类
            return Class.forName(stackTraceElement.getClassName());//返回main方法所在类的对象实例
         }
      }
   }
   catch (ClassNotFoundException ex) {
      // Swallow and continue
   }
   return null;
}
由此可初始化启动类,并且初始化设置ApplicationContextInitializer和ApplicationListener支撑程序后续的运行。






























































































































































































































































































































































































































































































  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值