0

Spring 占位符机制非常干净和健壮,不幸的是它只适用于 Spring 文件。

我正在使用EhCahe,我想在ehcache.xml文件上使用占位符机制。我有自己的 EhCache 工厂 bean,我可以将此库配置作为 InputStream 提供。所以我需要做的就是实现我的目标:

  • 从类路径读取 xml 文件内容
  • 访问当前 spring.xml 文件的属性占位符(配置了我的 bean 的那些)
  • 在读取资源上调用占位符
  • 将资源作为 InputStream 还给库

所以我的问题是,如何做到这一点,就像 Spring 允许的那样紧凑?我想避免自己创建占位符,所以代码会尽可能少地“魔法”,所以我想使用 xml 文件中的属性配置。

4

3 回答 3

1

EhCache 支持 ehcache.xml 文件中的系统属性占位符替换,因此一种选择是将 Spring 占位符值复制到系统属性中,以便可以在 ehcache.xml 文件中引用它们:

在春季上下文 xml...

<!-- Copy Spring placeholder value to System props -->
<bean id="systemProps" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject" value="#{@systemProperties}" />
    <property name="targetMethod" value="putAll" />
    <property name="arguments">
        <util:properties>
            <prop key="cache.ttl">${cache.ttl}</prop>
        </util:properties>
    </property>
</bean>

然后在您的 ehcache.xml 文件中,您现在可以使用${cache.ttl}上面填充的占位符:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
    <cache name="myCache" timeToLiveSeconds="${cache.ttl}" maxElementsInMemory="1000" overflowToDisk="false" />
</ehcache>
于 2013-03-19T16:14:51.383 回答
0

Ehcache 有一个 api 以编程方式定义新的缓存。为什么你不能做一个与春天一起启动并自动填充的豆子?这样您就不必创建自动 EhCache.xml,但您可以在 spring 上下文文件中定义所需的所有缓存。

于 2013-02-08T13:35:37.127 回答
0

不必使用系统属性。但是,您必须在构建期间解析占位符。

将您的属性放在对象中,如下所示:

<bean id="cacheProperties" class="java.util.Properties">
    <constructor-arg>
        <props>
            <prop key="prop1">#{prop1}</prop>
            <prop key="prop2">#{prop2}</prop>
        </props>
    </constructor-arg>
</bean>

并将它们设置为您的自定义 PlaceHolderHelper:

    <bean id="cachePlaceholderHelper"
      class="com.PlaceholderHelper" depends-on="cacheProperties">
    <property name="configFileResource" value="classpath:cacheConfig.xml"/>
    <property name="properties" ref="cacheProperties"/>
</bean>

PlaceholderHelper 可能看起来像这样:

private Resource configFileResource;
private Properties properties;
private Resource resolvedConfigResource;

@PostConstruct
public void replace() throws IOException {
    PropertyPlaceholderHelper helper = new PropertyPlaceholderHelper("${", "}");

    if (this.properties != null && this.configFileResource != null) {
        File file = this.configFileResource.getFile();
        String content = FileUtils.readFileToString(file);
        String result = helper.replacePlaceholders(content, this.properties);
        File resolvedCacheConfigFile = new File("resolvedCacheConfig");
        FileUtils.write(resolvedCacheConfigFile, result);

        resolvedConfigResource = new FileSystemResource(resolvedCacheConfigFile);
        logger.info(String.format("Placeholders in file %s were replaced.", file.getName()));
    }
}

将p:configLocation更改为已解析的资源:

p:configLocation="#{cachePlaceholderHelper.resolvedConfigResource}

现在您可以在 XML 的任何地方使用 ${prop1} 表达式。

于 2016-08-12T14:02:00.460 回答