在Spring配置的一个区域中,我们使用:
的applicationContext.xml :
<bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" lazy-init="true">
<property name="configLocation" value="classpath:ehcache.xml"/>
</bean>
但是,ehcache.xml不是标准的spring bean配置文件,而是包含$ {ehcache.providerURL},我们要根据我们在其他地方使用PropertyPlaceHolderConfigurer配置的内容来替换它:
ehcache.xml中:
<cacheManagerPeerProviderFactory
...
providerURL=${ehcache.providerURL}
...
</cacheManagerPeerProviderFactory>
我可以使用Maven / profile / filter组合,但这会创建一个特定于它正在构建的环境的构建。我真正想做的是在运行时预处理ehcache.xml,根据PropertyPlaceHolderConfigurer读取的属性执行替换,然后将结果传递给EhCacheManagerBean。
此时,我正在考虑以某种方式复制@Value注释背后的功能,因为它可以替换“bla bla bla $ {property} bla bla bla”,除非我需要在从磁盘读取文件后执行此操作。 / p>
关于如何解决这个问题的任何想法?
感谢。 -AP _
答案 0 :(得分:6)
要直接操作字符串,可以使用org.springframework.util.PropertyPlaceholderHelper
String template = "Key : ${key} value: ${value} "
PropertyPlaceholderHelper h = new PropertyPlaceholderHelper("${","}");
Properties p = new Properties();
p.setProperty("key","mykey");
p.setProperty("value","myvalue");
String out = h.replacePlaceholders(template,p);
它用相应的属性值替换模板中的值。
答案 1 :(得分:2)
经过一番搜索,这是我想出的本质。我将它打包到一个工厂中,该工厂接受一个资源并在用$ {propertyPlaceHolder}替换所有行后用持有者的实际值替换它。
final ConfigurableListableBeanFactory
factory =
((ConfigurableApplicationContext) applicationContext).getBeanFactory();
String line = null;
while ((line = reader.readLine()) != null) {
try {
final String
result = factory.resolveEmbeddedValue(line);
writer.println(result);
}
catch (final Exception e) {
log.error("Exception received while processing: " + line, e);
throw e;
}
}
此解决方案的好处是它使用与Spring相同的工具来解析@Value(“$ {fooBar}”)注释。这意味着您可以使用SpEL以及Spring在@Value注释中通常接受的其他内容。它还与PropertyPlaceholderConfigurer集成。
希望这有助于某人。
-AP _
答案 2 :(得分:1)
PropertyPlaceholderConfigurer用于替换Spring配置文件中的属性。它不会替换外部文件中的属性。 PropertyPlaceholderConfigurer无法解决您的问题。
您可以覆盖org.springframework.cache.ehcache.EhCacheManagerFactoryBean.afterPropertiesSet()
方法,并在创建CacheManager之前执行您想要对xml执行的任何操作。您知道它有多干净:)