5

Spring MVC Web アプリケーションでは、構成ファイルで Bean を次のように構成しています。

<bean class="com.callback.CallbackService"/>

サービス クラスでは、Bean は次のように初期化されます。

@Autowired
CallbackService service

上記の CallbackService は、次の 3 つの呼び出しを行うことによって接続プロパティを取得します (これは今のところ変更できません)。

System.getProperty("user");
System.getProperty("password");
System.getProperty("connectionURL");

CallbackService のインスタンスが宣言されているサービス クラスは、以下に示すようにプロパティ ファイルから読み取ることにより、上記の 3 つの値にアクセスできます。

@Value("${user}")
protected String userName;

@Value("${password}")
protected String password;

@Value("${connection}")
protected String connectionString;  

CallbackService のプロパティを設定する必要があるのは、以下に示すように、(初期化された後に) システム プロパティを設定することだけです。

System.setProperty("user", userName);
System.setProperty("password", password);
System.setProperty("connectionURL", connectionString);

しかし、私が抱えている問題は、オブジェクトが初期化される順序です。プロパティは初期化されていますが、Spring がプロパティ ファイルからそれらを準備する前に System.setProperty 呼び出しが発生したようです。

いくつかの解決策を試しましたが、値がプロパティ ファイルから読み込まれ、System.setProperty への呼び出しが呼び出される前に、CallbackService オブジェクトがインスタンス化されているようです。

@Controller メソッドの 1 つから値にアクセスすると値が表示されるため、プロパティ ファイルは最終的に読み取られます。問題は、プロパティが初期化され、CallbackService インスタンスがインスタンス化されるポイントです。

数時間グーグルで調べた後、次の解決策を試しましたが、CallbackServiceインスタンスの初期化/インスタンス化の前にシステムプロパティを設定しているようには見えません

  1. InitiazingBeanメソッド内でシステム プロパティを 実装および設定しますafterPropertiesSet()
  2. ApplicationListenerメソッド内でシステム プロパティを実装および設定しますonApplicationEvent()
  3. lazy-init=trueXML での CallbackService Bean 定義の設定。
  4. ここで説明されているようにシステム プロパティを設定するには、 Spring 構成ファイルを使用してシステム プロパティを設定します

上記のポイント 4 は私が望むもののようですが、コンテキスト ファイルに次の (必要な 3 つのプロパティを含む) を追加しても違いは見られませんでした。

<bean id="systemPrereqs"
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject" value="#{@systemProperties}" />
    <property name="targetMethod" value="putAll" />
    <property name="arguments">
        <!-- The new Properties -->
        <util:properties>
            <prop key="java.security.auth.login.config">/super/secret/jaas.conf</prop>
        </util:properties>
    </property>
</bean>

への呼び出しが実行される前にプロパティ ファイルから値が読み取られ、System.setPropertyその後でのみ CallbackService インスタンスがインスタンス化されるようにするにはどうすればよいですか?

ありがとう

4

1 に答える 1

5

システムプロパティを初期化する別の BeanCallbackService に依存させることができます。

 class SystemPropertiesInitializer {

      SystemPropertiesInitializer(@Value("${user}") String userName, 
              @Value("${password}") String password, 
              @Value("${connection}" String connectionString) {

          System.setProperty("user", userName);
          System.setProperty("password", password);
          System.setProperty("connectionURL", connectionString);
      }
 }

次、

 <bean id="systemPropertiesInitializer" class="com.callback.SystemPropertiesInitializer"/>
 <bean class="com.callback.CallbackService" depends-on="systemPropertiesInitializer"/>

または、 @DependsOnアノテーションを使用できます。

 @Component
 @DependsOn("systemPropertiesInitializer")
 class CallbackService { 
     // implementation omitted
 }
于 2013-01-06T21:13:22.620 に答える