How do I get a property value from an ApplicationContext object? (not using an annotation)

≡放荡痞女 提交于 2019-11-27 14:18:28

问题


If I have:

@Autowired private ApplicationContext ctx;

I can get beans and resources by using one of the the getBean methods. However, I can't figure out how to get property values.

Obviously, I can create a new bean which has an @Value property like:

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

What method do I call on the ApplicationContext object to get that value without autowiring a bean?

I usually use the @Value, but there is a situation where the SPeL expression needs to be dynamic, so I can't just use an annotation.


回答1:


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

somePropValue = ctx.getEnvironment().getProperty("someProp");



回答2:


Assuming that the ${someProp} property comes from a PropertyPlaceHolderConfigurer, that makes things difficult. The PropertyPlaceholderConfigurer is a BeanFactoryPostProcessor and as such only available at container startup time. So the properties are not available to a bean at runtime.

A solution would be to create some sort of a value holder bean that you initialize with the property / properties you need.

@Component
public class PropertyHolder{

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

    // + getter methods
}

Now inject this PropertyHolder wherever you need the properties and access the properties through the getter methods




回答3:


If you are stuck on Spring pre 3.1, you can use

somePropValue = ctx.getBeanFactory().resolveEmbeddedValue("${someProp}");


来源:https://stackoverflow.com/questions/10822951/how-do-i-get-a-property-value-from-an-applicationcontext-object-not-using-an-a

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!