使用SpringBoot框架可以让我们快速的构建一个web项目并能成功运行,而之前的SSM则需要我们大量的配置。那么,SpringBoot为什么可以如此神奇,这是怎么做到的呢?那就要介绍一下SpringBoot的自动配置机制。那么,SpringBoot的自动配置机制又是怎么完成相关工作的?
使用SpringBoot快速构建web项目,有几个核心部分,下面就对其进行主要介绍。
1. 场景启动器(starter)
在我们通过SpringBoot构建项目时,必须要在依赖中导入相关的场景启动器,例如web场景对应的spring-boot-starter-web
。那么,场景启动器是什么呢?包含哪些内容?
场景启动器会导入相关场景的所有依赖:例如web场景中会导入
starter-json
、starter-tomcat
、springmvc
每个场景启动器都会引入
spring-boot-starter
,也就是核心场景启动器。要注意的是,无论导入的是什么场景,对应的场景启动器都会导入spring-boot-starter
。换句话说,它在所有项目中都存在,因此它其中会包含通用的东西。核心场景启动器引入了
spring-boot-autoconfigure
。spring-boot-autoconfigure
里面囊括了所有场景的所有配置类。也就是说,如果这个包下的所有配置类都能生效,那么SpringBoot帮我们整合好的功能就都可以直接使用。但SpringBoot默认扫描不到
spring-boot-autoconfigure
下写好的所有配置类。因为SpringBoot默认只扫描主程序所在的包。
2. 主程序
使用SpringBoot构建项目后,会有一个主程序,也就是程序运行的入口,相当于main函数。其上会有注解@SpringBootApplication
标注,那么这个标注又在完成什么事情呢?
@SpringBootApplication
由三个注解组成@SpringBootConfiguration
、@EnableAutoConfiguratio
、@ComponentScan
。@SpringBootConfiguration
注解与@Configuration
注解功能相同,声明这是个配置类。@ComponentScan
我们也很熟悉,可以指定组件扫描的路径。因此,我们也可以直接通过@SpringBootApplication
指定扫描路径。- SpringBoot默认只能扫描自己主程序所在的包及其下面的子包。
@EnableAutoConfiguration
是SpringBoot 开启自动配置的核心:- 其源码中包含
@Import(AutoConfigurationImportSelector.class)
,可以批量给容器中导入组件。 - 因此,SpringBoot项目启动的时候利用 @Import 批量导入组件机制把
spring-boot-autoconfigure
包下的xxxxAutoConfiguration
类导入进来(自动配置类)。 - 虽然导入了包下所有的配置类,但并不是每一个配置类都能生效。每一个配置类都标注了条件注解
@ConditionalOnxxx
,只有条件成立,才能生效 。
- 其源码中包含
3. xxxxAutoConfiguration
自动配置类
根据前文所述,所有的SpringBoot项目都包含spring-boot-starter
,而spring-boot-starter
引入了spring-boot-autoconfigure
。spring-boot-autoconfigure
又包含了很多官方已经整合好的配置类,也就是 xxxxAutoConfiguration
。那么,配置类是怎么配置的呢?
配置类会使用
@Bean
给容器中放相关组件。许多自动配置类都有注解
@EnableConfigurationProperties(ServerProperties.class)
,用来把配置文件中指定前缀的属性值封装到 xxxProperties属性类中。例如,@EnableConfigurationProperties(ServerProperties.class)
会把配置文件中server下所有的配置值都映射到ServerProperties这个类中的属性值。给容器中放的所有组件的一些核心参数,都来自于xxxProperties。xxxProperties都是通过注解和配置文件绑定的。
因此,我们只需要改配置文件的值,核心组件的底层参数都能修改。
4. 总结
我们导入场景启动器,最终就会引入
spring-boot-autoconfigure
spring-boot-autoconfigure
有一个文件,META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
,里面包含着许多自动配置类,也就是xxxxAutoConfiguration
通过主程序注解中的
@EnableAutoConfiguration
,把所有的xxxxAutoConfiguration
都导入进来每个
xxxxAutoConfiguration
会根据自己的条件注解@ConditionalOnxxx
进行按需加载,用不到的就不会进行加载xxxxAutoConfiguration
会通过注解@EnableConfigurationProperties()
将xxxProperties
与配置文件进行绑定,获取自定义的的配置xxxAutoConfiguration
给容器中导入相关组件,组件都是从 xxxProperties中提取属性值
这样,通过SpringBoot的自动配置机制,我们只需要导入starter、修改配置文件,就能修改底层行为,根据我们的需求进行自定义配置。