7

これを含むSpringContextxmlファイルがあります

<context:property-placeholder location="classpath:cacheConfig.properties"/>

<bean id="cacheManager"
    class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="cacheManagerName" value="cacheName"/>
    <property name="shared" value="false"/>
    <property name="configLocation" value="classpath:cacheConfig.xml"/>
</bean>

目標は、顧客がこのようにプロパティファイルを編集できるようにすることです。

cache.maxMemoryElements="2000"

そして実際のcacheConfig.xmlファイルにこれがあります

<cache name="someCacheName"
   maxElementsInMemory="${cache.maxMemoryElements}" ... />

お客様に変更してほしくないアイテムが公開されないようにします。もちろん、上記の詳細は部分的にしか詳細に説明されておらず、機能していません。現在、これはログファイルに表示されます

Invocation of init method failed; nested exception is net.sf.ehcache.CacheException: Error configuring from input stream. Initial cause was null:149: Could not set attribute "maxElementsInMemory".

前もって感謝します...

4

4 に答える 4

12

この例では、外部ファイルで定義されたキャッシュを使用EhCacheManagerFactoryBeanして、への参照を公開するために使用します。@ ChssPly76が指摘しているように、SpringのプロパティリゾルバーはSpring独自のBean定義ファイル内でのみ機能します。CacheManagercacheConfig.xml

ただし、外部ファイルで個々のキャッシュを定義する必要はありません。次を使用して、SpringBean定義ファイル内で直接キャッシュを定義できますEhCacheFactoryBean

名前付きEHCacheキャッシュインスタンスを作成するFactoryBean...指定された名前付きキャッシュがキャッシュ構成記述子で構成されていない場合、このFactoryBeanは、指定された名前と指定されたキャッシュプロパティを使用してキャッシュのインスタンスを構築し、それをCacheManagerに追加します。後で取得。

つまり、でEhCacheFactoryBeanまだ定義されていない名前付きキャッシュを参照するために使用する場合cacheConfig.xml、Springは新しいキャッシュインスタンスを作成して構成し、CacheManager実行時に登録します。これにはmaxElementsInMemory、などの指定が含まれます。これはSpring Bean定義ファイルで指定されるため、プロパティリゾルバーが完全にサポートされます。

<context:property-placeholder location="classpath:cacheConfig.properties"/>

<bean id="myCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
    <property name="cacheManager" ref="cacheManager"/>
    <property name="maxElementsInMemory" value="${cache.maxMemoryElements}"/>
</bean>

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="shared" value="false"/>
    <property name="configLocation" value="classpath:cacheConfig.xml"/>
</bean>
于 2009-10-07T22:37:07.013 に答える
3

これは、PropertyPlaceholderConfigurerの動作方法ではありません。コンテキスト内の値を置き換えるために使用できますが、任意の外部ファイル内では使用できません。そしてcacheConfig.xml、これは外部ファイルです。SpringからEHCacheに渡されているだけです。

于 2009-10-07T18:45:44.563 に答える
2

MavenまたはAntを使用している場合、どちらもリソースファイル内のトークンのフィルタリングを実行する機能を提供します。

Mavenの場合、次のようなことができます

<cache name="someCacheName"
  maxElementsInMemory="${cache.maxMemoryElements}" ... />

そして、フィルターファイルまたはPOM自体に

 cache.maxMemoryElements = 200

Mavenでのリソースフィルタリング:決定的なガイド

Antでは、FilterSets<copy>タスクを使用してこれを行います。

于 2009-10-07T19:13:15.487 に答える
2

ehcache javadocがディスクストアパラメータが無視されると述べているために設定できないディスクストアパスを変更する必要がある場合は、ディスクストアパスを挿入できるEhCacheManagerFactoryBeanの独自の実装を作成できます。基本的に、CacheManagerの作成をインターセプトし、diskstoreプロパティを使用して渡された構成を変更する必要があります。例:

private String diskStorePath;

...getter/setter


public void afterPropertiesSet() throws IOException, CacheException {
    if (this.shared) {
        // Shared CacheManager singleton at the VM level.
        if (this.configLocation != null) {
            this.cacheManager = CacheManager.create(this.createConfig());
        }
        else {
            this.cacheManager = CacheManager.create();
        }
    }
    else {
        // Independent CacheManager instance (the default).
        if (this.configLocation != null) {
            this.cacheManager = new CacheManager(this.createConfig());
        }
        else {
            this.cacheManager = new CacheManager();
        }
    }
    if (this.cacheManagerName != null) {
        this.cacheManager.setName(this.cacheManagerName);
    }
}

private Configuration createConfig() throws CacheException, IOException {
    Configuration config = ConfigurationFactory.parseConfiguration(this.configLocation.getInputStream());

    DiskStoreConfiguration diskStoreConfiguration = config.getDiskStoreConfiguration();
    if (diskStoreConfiguration == null) {
        DiskStoreConfiguration diskStoreConfigurationParameter = new DiskStoreConfiguration();
        diskStoreConfigurationParameter.setPath(getDiskStorePath());
        config.addDiskStore(diskStoreConfigurationParameter);
    } else {
        diskStoreConfiguration.setPath(getDiskStorePath());
    }

    return config;
}

Springの設定は次のようになります。

<bean id="cacheManager" class="com.yourcompany.package.MyEhCacheManagerFactoryBean" depends-on="placeholderConfig">
    <property name="diskStorePath" value="${diskstore.path}"/>
    <property name="configLocation" value="classpath:ehcache.xml" />
</bean>
于 2011-05-19T14:15:23.247 に答える