Spring Boot @ConfigurationProperties正确用法

时间:2015-05-06 10:06:21

标签: 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() {
        // ...
    }
}

虽然当我们对应用程序进行原型设计时,这是一个很好的生产力提升,但我们开始质疑这是否正确使用。

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

问题:对任何商业财产/价值使用此机制是否“正确”,还是明显滥用?

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

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

1 个答案:

答案 0 :(得分:1)

如果您的属性代表可根据环境/配置文件配置的内容,那么该机制就是其中的内容。虽然我有点不清楚你的意思 "映射对象的特性"。

我一般不喜欢这种风格,特别是如果你的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   
}

然后你的Service类看起来像这样:

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

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

这至少可以让你通过它的构造函数轻松地将属性传递给不可变类(制作任何可变属性的副本)。如果您发现应用的其他部分需要一些共享配置,那么也可以重用属性bean。