0

Spring プレースホルダー メカニズムは非常にクリーンで堅牢ですが、残念ながら Spring ファイルでしか機能しません。

私はEhCaheを使用しており、ファイルでプレースホルダー メカニズムを使用したいと考えていehcache.xmlます。EhCache 用の独自のファクトリ Bean があり、このライブラリ構成を InputStream として指定できます。したがって、目標を達成するために必要なことは次のとおりです。

  • クラスパスから xml ファイルの内容を読み取る
  • 現在のspring.xmlファイルのプロパティプレースホルダーにアクセスします(私のBeanが構成されているもの)
  • 読み取りリソースでプレースホルダーを呼び出す
  • リソースをライブラリに InputStream として返します

だから私の質問は、Springが許す限りコンパクトにするにはどうすればいいですか?プレースホルダー自体の作成を避けたいので、コードはできるだけ「魔法」を行わないようにするため、xml ファイルのプロパティ構成を使用したいと思います。

4

3 に答える 3

1

EhCache は ehcache.xml ファイルでシステム プロパティのプレースホルダー置換をサポートしているため、1 つのオプションは、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>

${cache.ttl}次に、ehcache.xml ファイルで、上記で入力したプレースホルダーを使用できるようになりました。

<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

システム プロパティを使用する必要はありません。ただし、ビルド中にプレースホルダーを解決する必要があります。

次のようにプロパティをオブジェクトに配置します。

<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 に答える
0

Ehcache には、新しいキャッシュをプログラムで定義するための API があります。春とともに起動し、自動的に充填される Bean を作成できなかったのはなぜですか? そうすれば、自動 EhCache.xml を作成する必要はありませんが、Spring コンテキスト ファイルで必要なすべてのキャッシュを定義できます。

于 2013-02-08T13:35:37.127 に答える