springboot SpringApplication的初始化
springboot的自动装配源于spring framework,springboot应用运行生命周期主要包括以下阶段:
1.SpringApplication初始化阶段;
2.SpringApplication运行阶段;
3.Spring Boot应用退出。
这里先简述一下springboot的启动初始化阶段。初始化阶段属于运行前的准备阶段,大多数springboot应用直接或间接地使用SpringApplication API 驱动Spring 应用, SpringApplication允许指定应用的类型,主要包括Web应用和非Web应用。从Springboot2.0开始,Web应用可分为Servlet Web和Reactive Web。SpringApplication的初始化准备主要包括两阶段:构造 和 配置。
SpringApplication构造阶段
构造阶段由其构造器完成,这也是个Java类。日常开发中使用的是run静态方法启动应用,而不是直接调用其构造方法。
通过工具,在SpringApplication的源码中,可以看到run方法调用了他的构造器:
在SpringApplication源码中的开始部分可以找到两个构造器实现,run方法默认调用是第一个,而第一个构造器会调用第二个构造实现:
根据以上方法间的调用关系,SpringApplication.run(SpringApplicationConfiguration.class, args) 等价于new SpringApplication(new Class[] {SpringApplicationConfiguration.class}).run(args)。
SpringApplication主配置类的概念和实现是从Spring Boot2.0开始引入的。一般地引导类就是主配置类,并作为primarySources参数的值传入上面的构造器,引导类就是标注了@EnableAutoConfiguration注解或者标注了@SpringBootApplication注解,由于后者元标注了@EnableAutoConfiguration,因此两者均被spring底层应用上下文以@EnableAutoConfiguration处理。这个可以通过写个测试程序,然后取消@EnableAutoConfiguration注解来检验(日志会提示你未注册的组件)。换句话说,构造器的primarySources参数实际上是Spring Boot应用上下文的Configuration 类,该配置类也可以不是引导类的独立配置类,只是被引导类调起,至于引导类就是配置类,纯属简化操作。从Java类的视角重新审视SpringApplication类,可以发现主配置类属性primarySources还可以通过SpringApplication#addPrimarySources(Collection)方法设置:
以上主要陈述了一个事实:springboot应用引导类通过调用SpringApplication类的run方法调起其构造方法,这两个呆萌的构造方法上上图可见。前面已经表过,真正干事的是第二个构造方法,仔细观察其实现可以发现主要包括5个事:保存主配置类primarySources到其属性的内存中、推断Web应用类型、加载Spring应用上下文初始化器、加载Spring应用事件监听器和推断应用引导类。如下图所示,五句金玉良言:
那么下面,就从这五句金玉良言展开探探底。
第一句不做赘述,前面已讲就是存储主配置类primarySources到当前对象的属性中去。第二句是:
this.webApplicationType = this.deduceWebApplicationType(); // 推断Web应用类型
未完待续……
声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 嗅谱网
转载请注明:转自《springboot SpringApplication的初始化》
本文地址:http://www.xiupu.net/archives-10007.html
关注公众号:
微信赞赏
支付宝赞赏