赞
踩
在我们通过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默认只扫描主程序所在的包。
使用SpringBoot构建项目后,会有一个主程序,也就是程序运行的入口,相当于main函数。其上会有注解@SpringBootApplication
标注,那么这个标注又在完成什么事情呢?
@SpringBootApplication
由三个注解组成@SpringBootConfiguration
、@EnableAutoConfiguratio
、@ComponentScan
。
@SpringBootConfiguration
注解与@Configuration
注解功能相同,声明这是个配置类。@ComponentScan
我们也很熟悉,可以指定组件扫描的路径。因此,我们也可以直接通过@SpringBootApplication
指定扫描路径。@EnableAutoConfiguration
是SpringBoot 开启自动配置的核心:
@Import(AutoConfigurationImportSelector.class)
,可以批量给容器中导入组件。spring-boot-autoconfigure
包下的xxxxAutoConfiguration
类导入进来(自动配置类)。@ConditionalOnxxx
,只有条件成立,才能生效 。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都是通过注解和配置文件绑定的。
因此,我们只需要改配置文件的值,核心组件的底层参数都能修改。
我们导入场景启动器,最终就会引入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、修改配置文件,就能修改底层行为,根据我们的需求进行自定义配置。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。