最新实战案例锦集:《Spring Boot3实战案例合集》持续更新,每天至少更新一篇文章,订阅后将赠送文章最后展示的所有MD文档(学习笔记)。
环境:Spring Boot3.2.5
1. 简介
Spring Boot 有许多有用的功能,包括外部化配置和轻松访问属性文件中定义的属性。如果你想在类定义中或在@Configuration注解的类中的@Bean方法绑定并验证一些外部属性(例如,来自.properties文件),请使用@ConfigurationProperties注解。
@ConfigurationProperties注解的绑定操作要么通过调用被注解类的setter方法来完成,要么(如果使用了@ConstructorBinding)通过绑定到构造器参数来完成。
请注意,与@Value不同,由于属性值被外部化,因此不会处理SpEL表达式。
接下来,我们将深入的讨论关于 @ConfigurationProperties 注解的各种高级用法。
2. 实战案例
2.1 简单属性
官方文档建议我们将配置属性隔离到单独的POJO(Plain Old Java Object,简单的Java对象)中,如下示例:
@Configuration
@ConfigurationProperties(prefix = "pack.mail")
public class ConfigProperties {
private String hostName ;
private int port ;
private String from ;
// getters and setters
}
@ConfigurationProperties 对具有相同前缀的分层属性效果最佳;因此,我们添加了 pack.mail前缀。
注意:如果我们不在POJO中使用@Configuration注解,那么我们需要在主Spring应用程序类中添加@EnableConfigurationProperties(ConfigProperties.class)注解,以便将属性绑定到POJO中,如下示例:
@SpringBootApplication
@EnableConfigurationProperties(ConfigProperties.class)
public class MyApplication {
}
这样,我们就不需要在ConfigProperties类上添加@Configuration或@Component注解。
Spring 对绑定属性使用了一些宽松的规则。因此,以下变化都绑定到了 hostName 属性:
pack.mail.hostName
pack.mail.hostname
pack.mail.host_name
pack.mail.host-name
pack.mail.HOST_NAME
因此,我们可以使用下面的属性文件来设置所有字段:
pack:
mail:
hostname: pack@mail.com
port: 9000
from: xxxooo@mail.com
注:如果你配置的值有特殊字符,你可以使用单引号'xxxxx' 。
2.2 配置类扫描
从Spring Boot 2.2开始,Spring通过类路径扫描来查找和注册@ConfigurationProperties
类。要使@ConfigurationProperties
的扫描生效,需要显式地通过添加@ConfigurationPropertiesScan
注解来选择加入。因此,我们不必在这些类上使用@Component
(以及其他元注解,如@Configuration
),甚至不需要使用@EnableConfigurationProperties,如下示例:
@ConfigurationProperties(prefix = "pack.mail")
@ConfigurationPropertiesScan
public class ConfigProperties {
private String hostName ;
private int port ;
private String from ;
// getters and setters
}
如上注解后,Spring Boot会自动的查找那些使用了@ConfigurationProperties注解的类。
此外,我们还可以使用 @ConfigurationPropertiesScan 注解来扫描自定义位置的配置属性类,如下示例:
@SpringBootApplication
@ConfigurationPropertiesScan("com.pack.properties")
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args) ;
}
}
这样,Spring 将只在 com.pack.properties 包中查找配置属性类。