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处理配置类源码解析

(超详解)SpringBoot高级部分-自动配置+监听机制+监控+项目部署

Spring和SpringBoot的重要回调机制

springboot源码解析-自定义系统初始化器

springboot源码解析-自定义系统初始化器

深入剖析!springboot集成mysql