2019独角兽企业重金招聘Python工程师标准>>>
本文会通过分析上一篇中跑起来的示例程序来分析一下Spring Boot程序运行的基本原理。
概要
在上一篇的介绍中,程序是通过SpringBoot1HelloworldApplication.main()
方法运行起来的:
public static void main(String[] args) {SpringApplication.run(SpringBoot1HelloworldApplication.class, args);
}
从代码中可以看到,通过SpringApplication.run
,这样一个静态方法,非常便捷地启动了一个Spring程序。SpringApplication
这个类实际上就是一个Spring Boot应用的起点,每一个Spring Boot的应用都会有一个类似的启动类,而run
方法的实际的作用是初始化了一个Spring容器的上下文。下面我们来分析一下这个简单的应用是如何启动起来的。
思考
按照以往使用Spring Framework的经验,初始化一个Spring容器,需要读取一些配置信息,但是在我们这个示例程序里面是没有做任何配置的,先看一下源码。
源码分析
从SpringApplication.run()方法一路追踪,看到下面的一个运行的过程:
上面的源码最下面的红框中在加载META-INF下面的spring.factories
文件,然后我们看到有很几个包里面都带这个文件,我们主要关注一下spring-boot-autoconfigure
这个包下面的。
大致内容示例如下:
可以看出,这个文件基本上都是定义一些Initializer
和Listener
这些定义都会在SpringApplication。run
启动的时候进行加载。这些内容加载之后有什么用呢,以上图中红框对应的org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration
进行举例说明,先看一下该类的源码:
简单理解一下这个类上的几个注解:
- @Configuration 本类是一个Spring的配置类
- @ConditionalOnClass({ RabbitTemplate.class, Channel.class }) 类路径中有注解中的两个类则加载本配置
- @EnableConfigurationProperties(RabbitProperties.class) 加载注解类中对应的配置类
到这里我们大概就知道了这个spring.factories
配置文件其实就是定义了一些Spring启动需要的监听以及Spring Boot 启动是的默认配置,这样就能达到在不做任何配置的情况下,启用Spring Boot提供的默认配置来启动程序。
SpringApplication运行及自动配置总结
简单总结一下:
- 每个Spring Boot 程序都包括一个main函数来运行SpringApplication.run(),进行系统启动。(目前可以这么认为)
- 这个run方法里面会初始化一个Spring的容器,初始化的内容都在项目及各个jar文件的META-INF下面的
spring.factories
中定义的各个配置类、监听等等。 - 每个自动配置类都是基于条件进行加载的,即我们在项目中引入某些包之后,不添加配置或者少量必需配置后即可使用该包的功能。
欢迎关注我的微信公众号: