SpringBoot配置详解
原理
自动配置:
pom.xml
- spring-boot-dependencies:核心依赖在父工程中
- 所以引入依赖时,不需要指定版本
启动器
-
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starte</artifactId> </dependency>
-
启动器:就是Springboot的启动场景
-
比如:spring-boot-starter-web,就会自动导入web环境所有的依赖
-
Springboot会将所有的功能场景变成一个个启动器
-
要使用什么功能,就只需要找到对应的启动器就可以
starter
主程序
//标注此类是一个Springboot应用
@SpringBootApplication
public class HelloworldApplication {
//将Springboot应用启动
public static void main(String[] args) {
SpringApplication.run(HelloworldApplication.class, args);
}
}
-
注解
-
@SpringBootConfiguration:Springboot的配置 @Configuration:spring配置类 @Component:是一个组件 @EnableAutoConfiguration:自动配置 @AutoConfigurationPackage:自动配置包 @Import({Registrar.class}):自动配置包`注册` @Import({AutoConfigurationImportSelector.class}):自动配置导入选择 //获取所有的配置 List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
-
获取候选的配置
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
META-INF/spring.factories:自动配置的核心文件
//所有的资源加载到配置类中
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
结论:springboot的所有自动配置都是在启动的时候扫描并加载的,spring.factories
所有的自动配置类都在这里,但是不一定生效,要判断条件是否成立(同过@ConditionalOnMissingXxx),只要导入了对应的starter,就由对应的启动器了,有了启动器,自动装配就会生效。然后就配置成功了
- springboot在启动时,从类(org.springframework.boot:spring-boot-autoconfigure)路径META-INF/spring.factories获取指定的值
- 将这些自动配置的类导入容器,自动配置类就会生效,帮我们进行自动配置
- 以前需要自动配置的东西,现在springboot帮我们做
- 整个javaee,解决方案和自动配置的东西都在spring-boot-autoconfigure包下
- 它会把所有需要导入的组件,以类名的方式返回,这些组件会被添加到容器中
- 容器中也会存在非常多的XxxAutoConfigure的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件,并自动配置,@Configuration
- 有了自动配置类,就免去了我们手动编写配置文件的工作
配置文件
-
//SPEL表达式加载配置,不推荐 @Value("${name}")
-
properties:key=value
-
//指定配置文件 @PropertySource(value = "classpath:Xxx.properties")
-
-
yml/yaml:key:空格value
-
//加载yml配置 @ConfigurationProperties(prefix = "person")
-
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 单个指定 |
松散绑定 | 支持 | 不支持 |
SPEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
- 松散绑定:yml中属性是last-name,等同于lastName
- JSR303:字段增加过滤验证,保证数据合法
- 类上@Validated:要数据校验,然后字段上加上校验类型,如:@Email
- 复杂类型封装:yml中可以封装对象
结论:
- 推荐yml
- 只需要获取文件中某个值,用@Value
- 编写了JavaBean来和配置文件映射,就使用@ConfigurationProperties
配置文件位置
优先级从高到低
- 项目config文件里
- 项目根目录下
- resource下
- resource下config里
不同环境
不同环境下,可以配置不同的配置文件。默认配置文件:application.yml
- 开发:application-dev.yml
- 测试:application-test.yml
多环境配置
-
多个配置文件
#配置application-test.yml为默认配置文件 spring: profiles: active: test
-
application.yml单个配置文件
#默认使用test环境 server: port: 8081 spring: profiles: active: test --- server: port: 8083 spring: profiles: dev --- server: port: 8084 spring: profiles: test
配置原理
配置文件中能配置的东西。规律: XxxxAutoConfiguration去自动装配东西,有默认值,XxxProperties可以和配置文件绑定,就可以使用自定义配置
自动装配原理总结:
- SpringBoot启动会加载大量的自动配置类
- 看我们需要的功能是否在SpringBoot默认写好的自动配置类中
- 在的话就不需要手动配置,否则要手动配置
- 给容器中自动配置类添加组件的时候,会从properties中获取某些属性。我们只需要在配置文件中指定这些属性值即可
xxxAutoConfiguration:自动配置类,给容器中添加组件
xxxProperties:封装配置文件中相关属性
可以通过配置debug:true查看配置有无生效