2014-10-08 57 views
0

不确定这是最好的方法。我们创建了一个可供不同项目使用的jar。依赖这个jar的其他项目需要提供在其spring属性文件中定义的某些属性。 (我们的jar不应该在乎他们命名这些属性文件。)从PropertySourcesPlaceholderConfigurer在Spring中运行时查找动态属性?

使用@Value(“$ {some.prop}”)对大多数属性都很好,但是现在我们需要属性的名称看起来是动态的。例如:

int val = getSomeVal(); 
String propNeeded = foo.getProperty("foo."+val+".dynamic.prop"); 

不知道什么“富”应该是我的访问。我看着注入环境,但是从我所有的googling看起来,它不会从XML属性占位符定义加载(即使定义为PropertySourcesPlaceholderConfigurer的bean def)。您似乎必须使用@PropertySource,但我的主要配置是一个XML文件,所以不知道如何让环境工作。 (我不能真的去'老skool'和查找属性文件作为类路径资源,因为我不知道用户定义的文件的名称。)

我不介意制作这个特殊的Service类ApplicationContextAware,但是如果我这样做了,我怎样才能访问底层的PropertySourcesPlaceholderConfigurer?我会“看起来?”需要为了动态访问一个属性?

另一种选择是,我强迫罐子的用户来声明一个名字一个bean,我可以看一下

<util:properties id="appProps" location="classpath:application.properties" /> 

然后我注入appProps的属性,并从那里查找。我不喜欢这种方法,因为它强制图书馆的用户用一个公共的ID命名一个文件。我认为最好的解决方案是以某种方式获得一个句柄给我的服务类中的底层PropertySourcesPlaceholderConfigurer ......我只是不知道该怎么做?

为什么不简单地允许PropertySource通过你的XML配置来定义一些,然后我可以只注入Environment?

感谢您的任何建议如何实现我想要的。

回答

0

您可以声明ReloadableResourceBundleMessageSource与PropertySourcesPlaceholderConfigurer从相同的源读取。这样,您可以只使用@Autowire MessageSource(或使您的bean实现MessageSourceAware)并使用它来检索您的属性。

使用ReloadableResourceBundleMessageSource的主要原因是检索I18N消息,以便那种hacky ...

相关问题