我们现在经常用到配置文件,配置属性。
对于各种不同的属性,如果没有统一的管理那么整体就显的很是混乱,项目随处可见的 @Value 注解,看起来很是让人头疼。那么如何才能让配置属性优雅一些呢?那就可以用 @ConfigurationProperties 注解。
以Nacos为例
首先来看一个配置示例:Nacos的一些配置属性。
# 应用名称
spring.application.name=spring-cloud-nacos
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
# 应用服务 WEB 访问端口
server.port=8080
从上不难看出这些配置属性有一个统一的前缀: spring.cloud.nacos.discovery ,这个前缀有什么作用呢?接着看Nacos的使用。
@ConfigurationProperties("spring.cloud.nacos.discovery")
public class NacosDiscoveryProperties {
/**
* nacos discovery server address.
*/
private String serverAddr;
/**
* the nacos authentication username.
*/
private String username;
/**
* the nacos authentication password.
*/
private String password;
}
很显然 @ConfigurationProperties 需要通过统一的前缀,来实现配置属性的统一管理。
在项目中应用
看官网说明:
引入jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
插件中排除
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
来一个Demo
配置文件
# 应用名称
spring.application.name=spring-cloud-nacos
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
# 应用服务 WEB 访问端口
server.port=8080
fishbone.name=asdjkl
fishbone.age=123
fishbone.addr-now=BJ
实体类
@Component
@Data
@ConfigurationProperties("fishbone")
public class MyPropertiesTest {
private String name;
private int age;
private String addrNow;
@PostConstruct
public void init() {
System.out.println("MyPropertiesTest :" + name + ":" + age + " : " + addrNow);
}
}
看下结果:
OK,挺好
注意事项
- 配置文件中的属性使用宽松绑定规则。addr_now、addrNow、addr-Now都可以匹配到。
- 配置类必须要被Spring扫描到才可以。所以需要 @Component 注解
- 配置类一定要有 get/set 方法。