在Spring和SPeL中使用@Value注释

时间:2017-07-10 19:28:00

标签: spring

我正试图在spring boot 1.5应用程序中找到一种方法来执行以下操作。

  1. 我有一个变量,它的值是动态的,意味着它来自外部系统。

    String name = "abc"; //gets set externally

  2. 我想尝试使用名称的值来查找我的属性文件,看看是否有定义的匹配属性。类似......

    @Value("#{myClassName.name.concat('something')}") String propertyValue;

  3. 现在我的application.property文件设置了以下属性 假设name具有值" abc"

    属性文件内容:

    abc.something:abcValue
    

    现在,当我尝试访问变量propertyValue的值时,它会设置为值abc.something而不是abcValue

    我可能认为我无法使用@Value#{}达成协议,我想知道是否有办法在#{}内使用${}以便我在使用#{}计算属性名称后,转到并获取属性值。

    请告诉我您是否需要更多详情。

1 个答案:

答案 0 :(得分:2)

bean生命周期需要在编译时解析属性。因此,@Value需要常量参数。

enter image description here

您可以使用Environment bean以编程方式访问您的媒体资源。

import org.springframework.core.env.Environment;

@Service
public class Serivce {

    @Autowired
    private Environment environment;

    public String getProperty(final String keyPart) {
        String key = "build.your." + keyPart;
        return environment.getProperty(key)
    }
}

顺便说一句,您可以在SpEL中使用#('${spring.some.property}')来访问占位符。

// This is valid access to property
@Value("#('${spring.some.property}')")
private String property;