56

如果我有:

@Autowired private ApplicationContext ctx;

我可以使用其中一种 getBean 方法来获取 bean 和资源。但是,我不知道如何获取属性值。

显然,我可以创建一个具有 @Value 属性的新 bean,例如:

private @Value("${someProp}") String somePropValue;

我在 ApplicationContext 对象上调用什么方法来获取该值而不自动装配 bean?

我通常使用@Value,但是有一种情况是SPeL表达式需要是动态的,所以我不能只使用注解。

4

3 回答 3

66

In the case where SPeL expression needs to be dynamic, get the property value manually:

somePropValue = ctx.getEnvironment().getProperty("someProp");
于 2014-04-19T05:06:25.727 回答
18

如果你被困在 Spring pre 3.1 上,你可以使用

somePropValue = ctx.getBeanFactory().resolveEmbeddedValue("${someProp}");
于 2015-03-07T22:10:13.833 回答
18

假设该${someProp}属性来自 PropertyPlaceHolderConfigurer,这会使事情变得困难。PropertyPlaceholderConfigurer 是一个 BeanFactoryPostProcessor,因此仅在容器启动时可用。所以这些属性在运行时对 bean 不可用。

一种解决方案是创建某种值持有者 bean,您可以使用所需的属性/属性对其进行初始化。

@Component
public class PropertyHolder{

    @Value("${props.foo}") private String foo;
    @Value("${props.bar}") private String bar;

    // + getter methods
}

现在在需要属性的地方注入这个 PropertyHolder 并通过 getter 方法访问属性

于 2012-05-30T19:56:06.663 回答