java - Spring Boot @ConfigurationProperties 正确用法

标签 java configuration spring-boot

我们实际上使用 Spring Boot 的 @ConfigurationProperties 作为基本上的配置映射器:它为我们提供了在对象上映射属性的简单快捷方式。

@ConfigurationProperties("my.service")
public class MyService {
    private String filePrefix;
    private Boolean coefficient;
    private Date beginDate;
    // getters/setters mandatory at the time of writing

    public void doBusinessStuff() {
        // ...
    }
}

尽管在我们制作应用程序原型(prototype)时,这极大地提高了工作效率,但我们开始质疑这是否是正确的用法。

我的意思是,配置属性在 Spring Boot 的上下文中具有不同的状态,它们通过执行器端点公开,它们可用于触发条件 bean,并且似乎更面向技术配置属性。

问题:在任何业务属性/值上使用此机制是否“正确”,还是纯粹的滥用?

我们错过了任何潜在的缺点吗?

现在我们唯一担心的是我们不能在不可变类上使用@ConfigurationProperties,这与Spring Boot跟踪器上的这个问题密切相关:Allow field based @ConfigurationProperties binding

最佳答案

如果您的属性代表可根据环境/配置文件进行配置的内容,则该机制就是为此而设计的。虽然我有点不清楚你的意思 “在对象上映射属性”。

一般来说,我不喜欢这种风格,特别是当您的 bean 有多个属性需要设置时。更标准的习惯用法是使用一个类来封装用于创建 bean 的属性/设置:

@ConfigurationProperties("my.service")
public class MyServiceProperties {
    private String filePrefix;
    private Boolean coefficient;
    private Date beginDate;
    // getters/setters mandatory at the time of writing   
}

那么你的服务类将如下所示:

@EnableConfigurationProperties(MyServiceProperties.class)
public class MyService {
    @Autowired
    private MyServiceProperties properties;
    //do stuff with properties

    public void doBusinessStuff() {
        // ...
    }
}

这至少允许您通过其构造函数轻松地将属性传递到不可变类中(复制任何可变属性)。如果您发现应用程序的其他部分需要一些共享配置,还可以重用属性 bean。

关于java - Spring Boot @ConfigurationProperties 正确用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30073582/

相关文章:

java - 将 System.setout 重定向回标准输出

java - 我们在spring实现微服务架构时是否创建了不同的项目

java - 将 Gradle.build 版本导入 Spring Boot

mysql - 更改 root 密码后 PHPMyAdmin 无法连接

ios - 在 Expo.io 中,我们如何为 ios Build 指定配置设备?

java - 访问外部 Spring Boot Java 项目中 application.properties 的属性

Java邮件 : get size of a MimeMessage

java - Junit - 模拟一个文件

java - 由 : javafx. fxml.LoadException 错误引起

configuration - 更改 TeamCity Web 服务器的端口