【问题标题】:Java Spring: How to use `@Value` annotation to inject an `Environment` property?Java Spring:如何使用`@Value`注解注入`Environment`属性?
【发布时间】:2013-01-15 01:07:11
【问题描述】:

使用诸如

之类的构造
@Component
public class SomeClass {

    @Inject
    private Environment env;

    private String key;


    @PostConstruct
    private void init() {

        key = env.getProperty("SOME_KEY_PROPERTY");

    }

    ....
}

可以为某些字段分配某些属性。

是否有更短、更简洁的形式来执行此操作?

【问题讨论】:

标签: java spring dependency-injection


【解决方案1】:

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

@Value("${awsId:#{environment.AWS_ACCESS_KEY_ID}}")
@Value("${awsSecret:#{environment.AWS_SECRET_ACCESS_KEY}}")

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

【讨论】:

    【解决方案2】:

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

    @Value("${some_property:default_value}")
    private String key;
    

    否则,只要未定义 some_property,就会出现异常。

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

    @Value("${some_property:}")
    private String key;
    

    (注意冒号)

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

    @Value("${some_property:#{'default_value'}}")
    private String key;
    

    【讨论】:

      【解决方案3】:

      您应该能够做到这一点(假设您已注册 PropertySourcesPlaceHolderConfigurer)

      @Value("${SOME_KEY_PROPERTY}")
      private String key;
      

      【讨论】:

      • 注意,这仅适用于 Spring 3.1+。
      • 这在我的 Spring Boot 应用程序(运行 spring-core 4.2.5.RELEASE)中对我有用,而且它看起来比其他接受的答案要干净得多。
      • 好的,但是如何配置所述 PropertySourcesPlaceHolderConfigurer 以获取环境变量值?
      • @asgs # 告诉 spring 它里面是一个 SpEL 表达式,而你有一个表达式是 environment 从环境中获取值。另一方面,$ 表示 spring 将尝试从属性文件、环境、命令行参数等加载其值的属性。
      • @asgs 你对环境变量是正确的。但是# 可以处理更多的事情,所以可能有些项目的#$ 更多。
      【解决方案4】:
      @Component
      public class SomeClass {
      
          @Value("#{environment.SOME_KEY_PROPERTY}")
          private String key;
      
          ....
      }
      

      【讨论】:

        猜你喜欢
        • 2011-09-19
        • 2020-10-22
        • 1970-01-01
        • 2011-10-31
        • 2011-02-02
        • 1970-01-01
        • 1970-01-01
        • 2012-08-06
        • 1970-01-01
        相关资源
        最近更新 更多