定义' *。属性' Spring中的文件位置

时间:2015-08-17 22:57:29

标签: java spring properties

我有几个bean的Spring上下文,比如:

<bean id="anyBean" class="com.my.app.AnyBean"
   p:test_user="${any1}"
   p:test_pass="${any2}">
</bean>

要解析这些占位符($ {any1}和$ {any2}),我使用:

<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" p:location="my.properties" />

它工作正常,但我需要定义&#39; my.properties&#39;的位置。来自&#39; main&#39;主类的方法。像这样:

ApplicationContext context = new ClassPathXmlApplicationContext(my_xml_config.xml);
PropertyPlaceholderConfigurer ppc = context.getBean("propertyPlaceholderConfigurer", PropertyPlaceholderConfigurer.class);

Resource resource = context.getResource("path/to/my.properties");
ppc.setLocation(resource);

但是当我尝试启动时:

  

线程中的异常&#34; main&#34;   org.springframework.beans.factory.BeanDefinitionStoreException:   名称为&#39; AnyBean&#39;的bean定义无效。在类路径中定义   资源[my_xml_config.xml]:无法解析占位符&#39; any1&#39;在   字符串值&#34; $ {any1}&#34;

你能暗示有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

当你试图获得一个bean

PropertyPlaceholderConfigurer ppc = context.getBean("propertyPlaceholderConfigurer", PropertyPlaceholderConfigurer.class);

Spring已经尝试刷新您的上下文并因为该属性不存在而失败。您需要通过specifying it in the constructor

阻止Spring执行此操作
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"my_xml_config.xml"}, false);

由于ApplicationContext未刷新,PropertyPlaceholderConfigurer bean不存在。

为此,您需要使用PropertySourcesPlaceholderConfigurer代替PropertyPlaceholderConfigurer(感谢M.Deinum)。您可以使用与PropertyPlaceholderConfigurer bean相同的方式在XML中声明它,或使用

<context:property-placeholder />

您需要利用PropertySourcesPlaceholderConfigurer拥有自己的位置,同时使用PropertySource ApplicationContext中注册的Environment个实例这一事实

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"your_config.xml"}, false);
// all sorts of constructors, many options for finding the resource
ResourcePropertySource properties = new ResourcePropertySource("path/to/my.properties");
context.getEnvironment().getPropertySources().addLast(properties);
context.refresh();