java - environment.getProperty("property") 是否产生与 @Value("property") 相同的值
问题描述
我正在重构一个项目,并在其中一项服务上找到了这段代码:
@Service
public class MyService {
private String API_PORT;
public JenkinsService(final Environment environment) {
this.API_PORT = environment.getProperty("server.port");
}
}
我怀疑我是否可以将其更改为以下代码(使用@Value)而不会出现意外行为:
@Service
public class MyService {
@Value("${server.port}")
private String API_PORT;
public JenkinsService() {}
}
解决方案
环境公开所有属性,您通常不希望这样。
此外,它还公开了有关您不关心的配置文件的信息(区分哪些已激活和所有)。
属性占位符${...}
应始终倾向于注入Environment
实例,但出于公平的原因,如Environment javadoc所述(重点是我的):
然而,在大多数情况下,应用程序级别的 bean 不需要直接与 Environment 交互,而是可能必须将 ${...} 属性值替换为属性占位符配置器,例如 PropertySourcesPlaceholderConfigurer,它本身是 EnvironmentAware 并且自Spring 3.1 使用时默认注册。
不是直接你的问题,而是构造函数注入应该比鼓励不透明和有缺陷的设计的字段注入更受青睐:
public class MyService {
private final String apiPort;
public MyService (@Value("${server.port}") String apiPort){
this.apiPort = apiPort;
}
}
推荐阅读
- drools - Drools 布尔比较
- c# - .NET Core 中游戏开发的浮点确定性
- java - Kotlin 中的 public static void main
- java - 如何将数组链接到方法
- c# - C# - 比较 UNC 路径
- soap - 将 OnVif PullPoint 服务与 Zeep 一起使用
- python - 在 Raspberry Pi 3 上使用 PyOpenGL 获取 glReadPixels(错误:1282,描述:b'invalid operation')
- elixir - 允许 Ecto 查询在测试环境中立即运行?
- javascript - LocalStorage addClass 多值
- java - JDateChooser 无法解析为类型