本文介绍一些 springboot 配置管理相关的内容,如何自定义配置,导入配置,配置绑定和基于 profiles 的配置。
在 spring 中使用 @Configuration 注解定义配置类,在 springboot 中使用 @SpringBootConfiguration 注解替换了 @Configuration 注解。示例如下:
//@Configuration
@SpringBootConfiguration
public class ConfigurationTest {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
导入配置类通过 @Import 注解导入,如果配置类都在类扫描路径下,就不用通过 @Import 注解导入了,如果不在默认类扫描的包下,可以使用 @ComponentScan 注解指定要扫描的包路径。
1)、properties 类型的配置文件格式采用 key=value 形式。
2)、yml / yaml 类型的文件采用 key: value 树状格式。yml 文件格式有以下两个说明:
a、键(key)冒号后面需要添加一个空格;
b、每个层级的缩进用两个空格。
1)、properties 类型可以使用 @PropertySource 和 @Value 注解进行配置绑定。
2)、yml 类型的配置文件不支持使用 @PropertySource 注解进行配置绑定,支持 @ConfigurationProperties 注解进行属性配置。
注意:
1)、@ConfigurationProperties 注解绑定参数,需要用到类的 setter 方法,然后在启动类上添加 @EnableConfigurationProperties({**Properties.class}) 注解;
2)、@ConfigurationProperties 可以放在类或者方法上(在方法上与@Bean联合使用,此时就不用再在启动类上添加 @EnableConfigurationProperties 注解),在方法上就是给返回的 bean 对象进行参数绑定;
3)、@ConfigurationProperties 注解绑定参数支持使用默认值,如果配置文件中未指定,则使用默认值。
// properties 文件的配置
@Data
@PropertySource("config/db.properties")
public class TestProperties {
@Value("${db.name}")
private String name;
}
// yml 文件配置
@Data
@ConfigurationProperties(prefix = "test.param")
public class TestProperties {
private String name;
private Integer age;
}
// 启动类上添加@EnableConfigurationProperties 将配置类导入容器
@SpringBootApplication
@Slf4j
@EnableConfigurationProperties({TestProperties.class})
public class AutoConfigurationTestApplication {
public static void main(String[] args) {
SpringApplication.run(AutoConfigurationTestApplication.class, args);
}
}
@ConfigurationProperties 注解需要与 @EnableConfigurationProperties 注解结合使用,这种方式有些繁杂,可以在启动类上使用 @ConfigurationPropertiesScan 注解,就可以扫描所指定的包下的参数类,在 basePackages 参数中指定具体的包即可。
@SpringBootApplication
@Slf4j
@ConfigurationPropertiesScan(basePackages = {})
public class AutoConfigurationTestApplication {
public static void main(String[] args) {
SpringApplication.run(AutoConfigurationTestApplication.class, args);
}
}
在进行参数绑定的时候,可以进行参数验证,保证绑定参数正常。引入以下依赖:
org.hibernate.validator
hibernate-validator
在绑定参数的实体类上可以使用对应的校验注解,例如 @NotNull .....。
在 springboot 中使用的配置文件默认名称为:application.properties / application.yml
1)、项目直接启动:
配置文件位置 | 优先级 |
项目根目录config文件夹下找配置文件(根目录是指和src目录同级) | 1 |
项目根目录下找配置文件(根目录是指和src目录同级) | 2 |
resources目录下找cofnig文件夹下找配置文件 | 3 |
resources目录下找配置文件 | 4 |
注意:
a、若同一个目录下有 .properties 文件和 yml 文件,会优先使用 .properties 文件。
b、springboot 会按照四个位置全部加载配置文件,如果高优先级的配置文件属性和低优先级的配置文件属性冲突,会使用优先级高的(使用第一次读到的),如果不冲突,则会共存互补。
2)、使用外部配置文件启动(使用 jar 包启动项目)
springboot 打包时不会把项目根目录下的 ./config 和 ./ 这两级目录打包进去。这个设计很巧妙,因为没有打包进来,所以SpringBoot可以加载外部发配置文件。
springboot 支持把配置文件放在外部。只要把配置文件放在 jar 包的同级目录下,或者放在同级下的config文件夹中,springboot 都会去此处读取配置文件。
命令行启动中,通过 --spring.config.location 参数指定配置文件的方式优先级最高,如果使用指定参数的形式(例如:--server.port),则使用此参数值。
注意:以上通过加载外部配置文件后,还会把 jar 包的 resources 目录下的配置也加载进来,相同属性使用优先级最高的。
在上节中,四个位置指定的配置文件,可以在配置文件中指定生效的 profile,相应的配置文件命名方式为:application-${profile}.properties/yml。指定使用的 profile 使用配置:spring.profiles.active=*。
在加载配置文件的时候,先加载不带 profile 的主配置文件,再加载带 profile 的配置文件,在主配置文件中使用 spring.profiles.active=*,指定使用哪个 profile 文件。
指定使用哪个 profile 的文件有以下几种方式:
1)、在主配置文件中指定,使用 spring.profiles.active=*。
2)、在命令行参数中指定:--spring.profiles.active=test。
3)、虚拟机参数中指定:-Dspring.profiles.active=test。
yml 文件中使用 --- 符号分隔,properties 文件使用 #--- 符号分隔。需要注意以下几点:
1)、多个 profile 之间的分隔符不能有空格,并且分隔符要连续。
2)、分隔符前、后一行不能是注释行。
3)、单配置文件配置多个 profile,不能被 @PropertySource 等注解加载。
以 yml 文件为例:
spring:
profiles:
active: prod #指定需要切换的环境,文件优先
---
spring:
profiles: dev #指定属于哪个环境
---
spring:
profiles: prod #指定属于哪个环境
profile 不仅可以激活配置类,还可以激活 java 对象,使用 @Profile 注解。
注意:
1)、在使用 @Component 和 @Configuration 注解时,可以直接把 @Profile 注解放到类上;
2)、用在 @ConfigurationProperties 注解上,如果使用包扫描的方式加载配置类可以直接使用 @Profile 注解;如果使用的是 @EnableConfigurationProperties, 需要将 @Profile 注解用在 @EnableConfigurationProperties 注解上。
本文详细介绍 springboot 加载配置,绑定配置,指定 profile 配置等功能,掌握 springboot 的配置使用,对于深入了解自动配置原理有着巨大帮助。
本人是一个从小白自学计算机技术,对运维、后端、各种中间件技术、大数据等有一定的学习心得,想获取自学总结资料(pdf版本)或者希望共同学习,关注微信公众号:it自学社团。后台回复相应技术名称/技术点即可获得。(本人学习宗旨:学会了就要免费分享)