所以我的弹簧启动应用程序有一个application.yml
文件,如下所示:
spring:
url: localhost
email:
from: something@gmail.com
app:
uuid: 3848348j34jk2dne9
我想将这些配置属性连接到我的应用程序中的不同组件,如下所示:
@Component
public class FooA {
private final String url;
public FooA(@Value("${spring.url}") String url) {
this.url = url
}
}
@Component
public class FooB {
private final String from;
public FooA(@Value("${email.from}") String from) {
this.from = from
}
}
@Component
public class FooC {
private final String uuid;
public FooA(@Value("${app.uuid}") String uuid) {
this.uuid = uuid
}
}
上述内容适用于我的应用程序。但我的问题是,这是否是春季靴子的最佳实践。我所知道的另一个替代方法是通过在配置类中创建bean来使用Properties
对象,使用所有配置变量加载属性并将属性bean自动装配到组件中。
在这种情况下,最佳做法是什么?
答案 0 :(得分:17)
正如您已经确定注入配置的两个主要选择是在单个属性上使用@Value
或在javabean配置对象上使用@ConfigurationProperties
。
您使用哪一个归结为偏好。我个人更喜欢使用配置对象。
使用@ConfigurationProperties
允许您使用JSR-303 bean验证
如果您愿意,也可以在javabean的setter中编写自己的自定义验证
您可以从非弹簧项目中注释配置bean,这样您就可以编写易于配置但不依赖于弹簧的库。
您可以从对象生成IDE元数据,这可能会使您的开发过程更加顺畅。
以下是使用弹簧配置时我建议的一些做法。
为应用程序的逻辑组件创建单独的@ConfigurationProperties
个对象。尽量保持模块化,避免为整个应用程序配置创建转储基地。
请勿在多个位置使用相同的@Value
属性
如果应用程序中的多个位置需要相同的配置,那么您应该将值移动到配置对象中
在多个@Value
注释中使用相同的属性会使得更难以推理,如果通过" SpEL"定义默认值,它也会导致意外行为。在一个地方而不是另一个地方表达。
不要在spring
命名空间中定义自己的属性
例如,您的spring.url
属性is not one of the properties defined in the documentation
通过使用相同的名称空间,您将面临在将来的spring-boot版本中使用该名称的风险。