如果我有:
@Autowired private ApplicationContext ctx;
我可以使用其中一个getBean方法获取bean和资源。但是,我无法弄清楚如何获得属性值。
显然,我可以创建一个具有@Value属性的新bean,如:
private @Value("${someProp}") String somePropValue;
我在ApplicationContext对象上调用什么方法来获取该值而不自动装配bean?
我通常使用@Value,但是有一种情况是SPeL表达式需要是动态的,所以我不能只使用注释。
答案 0 :(得分:44)
如果SPeL表达式需要是动态的,请手动获取属性值:
somePropValue = ctx.getEnvironment().getProperty("someProp");
答案 1 :(得分:15)
假设${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方法访问属性
答案 2 :(得分:9)
如果您遇到Spring 3.1之前的版本,可以使用
somePropValue = ctx.getBeanFactory().resolveEmbeddedValue("${someProp}");