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

Posted

技术标签:

【中文标题】Java Spring:如何使用`@Value`注解注入`Environment`属性?【英文标题】:Java Spring: How to use `@Value` annotation to inject an `Environment` property? 【发布时间】: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");

    

    ....

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

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

【问题讨论】:

看***.com/questions/3965446/… 【参考方案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;

    ....

【讨论】:

以上是关于Java Spring:如何使用`@Value`注解注入`Environment`属性?的主要内容,如果未能解决你的问题,请参考以下文章

spring @Value如何为变量java赋值[关闭]

Spring系列

Java方式配置Spring

java Spring使用环境变量作为@Value属性。

java Spring在@Value子句中使用环境变量。

工具类使用@Value将信息注入到静态变量中