不要再用@Value注解获取配置属性了

197 阅读2分钟

我们现在经常用到配置文件,配置属性。

对于各种不同的属性,如果没有统一的管理那么整体就显的很是混乱,项目随处可见的 @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 需要通过统一的前缀,来实现配置属性的统一管理。

在项目中应用

看官网说明:

image.png

引入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);
    }
}

看下结果:

image.png

OK,挺好


注意事项

  1. 配置文件中的属性使用宽松绑定规则。addr_now、addrNow、addr-Now都可以匹配到。
  2. 配置类必须要被Spring扫描到才可以。所以需要 @Component 注解
  3. 配置类一定要有 get/set 方法。