environment.getProperty(“ property”)是否产生与@Value(“ property”)相同的值

时间:2019-08-30 14:34:44

标签: java spring spring-boot

我正在重构一个项目,并在其中一项服务中找到了这段代码:

@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() {}
}

3 个答案:

答案 0 :(得分:3)

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

始终应优先使用属性占位符${...}来注入Environment实例,但出于Environment javadoc(强调是我的观点)所述的合理原因:

  

但是,在大多数情况下,应用程序级bean不需要   直接与环境互动,但可能不得不   将$ {...}个属性值替换为一个属性占位符   例如PropertySourcesPlaceholderConfigurer,它本身就是   默认情况下,默认情况下注册EnvironmentAware和Spring 3.1版本   使用。

不是直接问您的问题,但是应该鼓励使用构造函数注入而不是鼓励不透明和有缺陷的设计的字段注入:

public class MyService {   

    private final String apiPort;

    public MyService (@Value("${server.port}") String apiPort){
        this.apiPort = apiPort;
    }
}

答案 1 :(得分:1)

TL; DR:是

除非您使用自定义name = input ("Whose score would you like to modify? Type it in with this format - Name, Age Category: ") 做一些奇怪的事情,否则两个示例在默认的Spring Boot应用程序中将完全相同。

答案 2 :(得分:0)

$ {server.port}将具有一个整数值。

@Value(“ $ {server.port}”) 私有int API_PORT