首页 > 解决方案 > 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() {}
}

标签: javaspringspring-boot

解决方案


环境公开所有属性,您通常不希望这样。
此外,它还公开了有关您不关心的配置文件的信息(区分哪些已激活和所有)。

属性占位符${...}应始终倾向于注入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;
    }
}

推荐阅读