Java Spring:如何使用`@ Value`注释注入`Environment`属性?

Abd*_*ull 34 java spring dependency-injection

使用诸如的结构

@Component
public class SomeClass {

    @Inject
    private Environment env;

    private String key;


    @PostConstruct
    private void init() {

        key = env.getProperty("SOME_KEY_PROPERTY");

    }

    ....
}
Run Code Online (Sandbox Code Playgroud)

可以为某些字段分配一些属性.

有没有更短,更简洁的形式来做到这一点?

Abd*_*ull 42

@Component
public class SomeClass {

    @Value("#{environment.SOME_KEY_PROPERTY}")
    private String key;

    ....
}
Run Code Online (Sandbox Code Playgroud)

  • +1是在Spring 3.1之前完成的. (10认同)

Bij*_*men 38

您应该能够这样做(假设您已注册PropertySourcesPlaceHolderConfigurer)

@Value("${SOME_KEY_PROPERTY}")
private String key;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这仅适用于Spring 3.1+. (11认同)
  • @asgs ‘#’告诉spring,它里面是一个SpEL表达式,而你拥有的一个表达式是“environment”,用于从环境中获取值。另一方面,“$”表示 spring 将尝试从属性文件、环境、命令行参数等加载其值的属性。 (2认同)

rus*_*tyx 20

如果未定义变量,您可能还会发现提供默认值很有用:

@Value("${some_property:default_value}")
private String key;
Run Code Online (Sandbox Code Playgroud)

否则,无论何时some_property未定义,您都会收到异常.

default_value也可以是空白,在这种情况下,它的行为就像some_property是可选的:

@Value("${some_property:}")
private String key;
Run Code Online (Sandbox Code Playgroud)

(注意冒号)

如果默认值包含特殊字符(点,冒号等),则将其包装在SpEL中,如下所示:

@Value("${some_property:#{'default_value'}}")
private String key;
Run Code Online (Sandbox Code Playgroud)


Jos*_*nez 6

如果需要添加环境变量作为默认值。

@Value("${awsId:#{environment.AWS_ACCESS_KEY_ID}}")
@Value("${awsSecret:#{environment.AWS_SECRET_ACCESS_KEY}}")
Run Code Online (Sandbox Code Playgroud)

这是之前两个答案的组合。