4

プロパティ ファイルの値を Spring Environment プロパティに取得する方法を見つけようとしています。

これを行う Spring 3.1 以前の方法は次のようになります。

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

  <bean id="myBean" class="com.whatever.MyBean">
    <property name="someValue" value="${myProps.value}" />
    <!-- etc -->
  </bean>

私はこれを行うこともできました:

public class MyBean {

   @Value(value = "#{myProps.value}")
   private String someValue;

}

表向きは Environment クラスからプロパティを取得できるようになったので、これは、xml または Bean 自体で不格好な #{myProps.value} 構文を使用するよりも、プロパティを取得するためのはるかにクリーンな方法のように思えます。

XMLでこれを試しました:

<bean
    class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="location">
        <value>classpath:my.properties</value>
    </property>
</bean>

ただし、プロパティは環境に追加されません。

PropertySource属性を使用できることは理解していますが、注釈を使用して構成を行っていません。

では、小道具で設定された変数が環境で使用できるように、Bean / xml を設定するにはどうすればよいですか? さらに、「environmentInstance.getProperty("myProps.value")」と明示的に言わなくても、どうすればこれらの値を Bean に注入できますか?

4

2 に答える 2

1

Webアプリケーションの場合

XML Bean定義が処理される前に環境にデータを設定する場合は、Spring Sourceブログで説明されているように、ApplicationContextInitializer()を実装する必要があります。

<context-param>
    <param-name>contextInitializerClasses</param-name>
    <param-value>com.bank.MyInitializer</param-value>
</context-param>

これは、ブログの例を少し変更したものです。

public class MyInitializer implements
        ApplicationContextInitializer<ConfigurableWebApplicationContext> {
    public void initialize(ConfigurableWebApplicationContext ctx) {
        ResourcePropertySource ps;
        try {
            ps = new ResourcePropertySource(new ClassPathResource(
                    "my.properties"));
        } catch (IOException e) {
            throw new AssertionError("Resources for my.properties not found.");
        }
        ctx.getEnvironment().getPropertySources().addFirst(ps);
    }
  }

スタンドアロンアプリケーションの場合

基本的に同じことですが、AbstractApplicationContext直接の環境を変更することができます

   ResourcePropertySource ps;
   try {
        ps = new ResourcePropertySource(new ClassPathResource(
                        "my.properties"));
   }catch (IOException e) {
                throw new AssertionError("Resources for my.properties not found.");
   }
   //assuming that ctx is an AbstractApplicationContext
   ctx.getEnvironment().getPropertySources().addFirst(ps);

PSこの回答の以前のバージョンは、Beanから環境を変更する試みを示しましたが、 XMLの処理を開始するでも、環境プロパティのソースリストにデータを入力する必要があるため、SOに広がるアンチパターンのようです。XmlBeanDefinitionReaderプレースホルダーは<import/>ステートメント内で機能します。

于 2013-01-08T21:59:56.740 に答える
0

私の理解も少し追加されていますが、これは私が理解できることです:

  1. 環境は、現在アクティブなプロファイルを示す方法です(プロファイルは、Beanを選択的に作成する方法です)。
  2. PropertySourcesは環境に関連付けることができ、それを行う方法は@PropertySourceアノテーションを使用することですが、これに相当するxmlはないようです。
  3. 理解は実際には逆である必要があります。AFAIK:<context:property-placeholderプレースホルダーを宣言すると、ローカルで宣言されたプロパティに対してプロパティが解決され、環境で宣言されたプロパティソースにフォールバックできる場合、環境自体は新しいプロパティで変更されません。繰り返しますが、環境自体にプロパティを追加する唯一の方法は、@PropertySourceアノテーションを使用することです。
于 2013-01-08T21:57:48.263 に答える