3.1_SpringBoot内部处理机制解析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3.1_SpringBoot内部处理机制解析相关的知识,希望对你有一定的参考价值。
前言
目前基于SpringBoot进行Web应用开发已经成为一个趋势,Spring官网内部的很多入门Demo都是基于SpringBoot的,因此掌握SpringBoot成为当下基于Java的Web开发的必备技能。
SpringBoot相对于传统Servlet容器模式还是有几点颠覆性的改变的:
1、SpringBoot应用程序使用jar来运行,而传统模式是打成war包部署到Servlet容器中。使用jar的模式有助于减轻运维人员的工作,更便于在Docker这种云平台的运行环境中使用;
2、SpringBoot是应用启动容器,而传统模式是容器启动应用。这样SpringBoot的一个优势是程序本身管理了容器版本,业务代码与运行容器是直接绑定的;
3、SpringBoot使用了大量的AutoConfig来进行探测和应用配置,使得代码配置很简单,但内部处理细节也被隐藏的很深。
接下来我们将从一个简单的基于SpringBoot的Web工程开始,来探究SpringBoot的启动和加载过程,以便深入理解SpringBoot的内部工作机制。
样例工程
工程名称:sample-helloworld
package:com.sample.helloworld
main:SampleApplication
controller:SampleController
pojo:Greeting
pom.xml
parent使用spring-boot-starter-parent,依赖只有spring-boot-starter-web。
spring-boot-starter-parent中定义了项目构建的一些定义,而他的parent——spring-boot-dependencies中定义了SpringBoot可能使用到的所有第三方依赖的版本。
spring-boot-starter-web是一个pom工程,定义了一个web工程的基本依赖。
SampleApplication:直接启动应用。
SampleController:使用SpringMVC的RestController返回一个JSON对象。
Greeting:定义一个简单的POJO来作为返回对象。
最终效果是访问localhost:8080的时候,页面会展示一个JSON字符串。
启动代码解析
启动代码只有一行:SpringApplication.run(SampleApplication.class, args);
1、SpringApplication的run方法内部是new了SpringApplication,构造函数中保存了SourceClass,获取了外部配置的ApplicationContextInitializer和ApplicationListener,来支持外部组件的初始化和事件监听器。这些外部的功能扩展功能的配置信息都定义在各个jar的/META-INF/spring.factories的配置文件中,Spring通过SpringFactoriesLoader可以加载到这些配置信息。
2、执行SpringApplication实例的run方法。
2.1、创建SpringApplication自己的SpringApplicationRunListener,其实是代理调用了加载进来的ApplicationListener。
2.2、准备Environment,包括解析Properties文件、处理profile等。
2.3、创建ApplicationContext,因为现在应用类型是Servlet,创建的是AnnotationConfigServletWebServerApplicationContext。
2.4、对ApplicationContext进行配置,比如设置BeanNameGenerator、ResourceLoader等。然后加载资源,即解析传入的SourceClass来获取Bean定义。
2.5、启动ApplicationContext,AnnotationConfigServletWebServerApplicationContext继承了SpringFrameWork本身提供的GenericWebApplicationContext提供的功能并进行了扩展,以支持配置并启动Embed Tomcat。
2.5.1、对BeanFactory进行一些初始化配置。
2.5.2、执行BeanFactoryPostProcessor,其中包括对BeanDefinition的进一步处理。最重要的是ConfigurationClassPostProcessor,用来解析处理所有@Configuration标签类,并将Bean定义注册到BeanFactory中。因为@SpringBootApplication中包含了@EnableAutoConfiguration的meta-annotation,会进行自动配置处理,基本原理是判断工程依赖了哪些第三方组件并对其进行自动化配置,这样处理完@Configuration标签后,BeanFactory中就已经有大量的Bean定义了。
2.5.3、注册BeanPostProcessor,这些Processor会在首次getBean时执行。主要功能包括进行Autowire、Required等标签的处理,完成自动绑定等功能。也有特殊的关于WebServleterFactory的后续处理。
2.5.4、在ApplicationContext的onRefresh方法中会对Web容器(Tomcat)进行配置,包括注册Servlet、Filter、Listener等。
2.5.5、在ApplicationContext的finishRefresh方法中启动Web容器(Tomcat),完成应用的启动。
后续将会在3.1.x章节继续对系统启动的各个关键点进行详细解析。
以上是关于3.1_SpringBoot内部处理机制解析的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot第二特性:Starter启动依赖_02_SpringBoot处理配置类源码解析