2

Spring 構成の 1 つの領域で、以下を使用しています。

applicationContext.xml :

<bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" lazy-init="true">
    <property name="configLocation" value="classpath:ehcache.xml"/>
</bean>

ただし、ehcache.xml は標準の Spring Bean 構成ファイルではありませんが、別の場所で PropertyPlaceHolderConfigurer を使用して構成した内容に基づいて置き換えたい ${ehcache.providerURL} が含まれています。

ehcache.xml :

<cacheManagerPeerProviderFactory
   ...
   providerURL=${ehcache.providerURL}
   ...
</cacheManagerPeerProviderFactory>

Maven/プロファイル/フィルターの組み合わせを使用することもできますが、ビルド対象の環境に固有のビルドが作成されます。私が本当にやりたいことは、実行時に ehcache.xml を前処理して、PropertyPlaceHolderConfigurer によって読み取られたプロパティに基づいて置換を実行し、その結果を EhCacheManagerBean に渡すことです。

この時点で、ディスクからファイルを読み取った後にこれを行う必要があることを除いて、「bla bla bla ${property} bla bla bla」を置き換えることができるため、@Value アノテーションの背後にある機能を複製することを考えています。

これをどうやって進めるかについてのアイデアはありますか?

ありがとう。-AP_

4

3 に答える 3

7

文字列を直接操作するには、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);

テンプレートの値を対応するプロパティ値に置き換えます。

于 2012-04-06T20:44:13.840 に答える
3

いくつか検索した後、これが私が思いついたものの本質です。これをファクトリにパッケージ化しました。ファクトリはリソースを受け入れ、すべての行を$ {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_

于 2012-04-06T08:02:22.437 に答える
1

PropertyPlaceholderConfigurerは、Spring構成ファイル内のプロパティを置き換えるために機能します。外部ファイルのプロパティは置き換えられません。PropertyPlaceholderConfigurerでは問題を解決できません。

org.springframework.cache.ehcache.EhCacheManagerFactoryBean.afterPropertiesSet()CacheManagerを作成する前に、メソッドをオーバーライドしてxmlでやりたいことを何でも行うことができます。

于 2012-04-06T00:57:07.297 に答える