我可以使用PropertyPlaceholderConfigurer在运行时在String上执行属性替换吗?

时间:2012-04-06 00:00:48

标签: spring ehcache

在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 _

3 个答案:

答案 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执行的任何操作。您知道它有多干净:)