2016-08-26 2 views
2

私はスプリングのプロパティソースのデフォルトの順序を知っています:http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html 特定の優先順位で自分のプロパティソースを追加するにはどうすればよいですか?それは非常に低い優先度で新しいプロパティを追加するようSpringブートプロパティソースの階層にプラグインする

@PropertySourceは十分ではありません

答えて

0

これを実行する方法はたくさんあります。 I'll just quote the official documentation

SpringApplicationApplicationListener sおよびコンテキストや環境へのカスタマイズを適用するために使用されているApplicationContextInitializer秒を持っています。 Springブートは、内部で使用するための多数のカスタマイズを、META-INF/spring.factoriesからロードします。追加のものを登録するには複数の方法があります:

  • プログラムでアプリケーションごとのあなたはそれを実行する前にSpringApplicationaddListenersaddInitializersメソッドを呼び出すことによって。
  • アプリケーションごとに宣言的にcontext.initializer.classesまたはcontext.listener.classesを設定してください。
  • META-INF/spring.factoriesを追加し、アプリケーションがすべてライブラリとして使用するjarファイルをパッケージ化することによって、宣言的にすべてのアプリケーションを対象とします。

SpringApplicationは、(コンテキストが作成されていても、いくつかの前に)リスナーにいくつかの特別なApplicationEventsを送信し、その後、同様のApplicationContextによって公開されたイベントのリスナーを登録します。完全なリストについては、「Spring起動機能」セクションのSection 23.4, “Application events and listeners”を参照してください。

EnvironmentPostProcessorを使用してアプリケーションコンテキストをリフレッシュする前にEnvironmentをカスタマイズすることもできます。各実装はMETA-INF/spring.factoriesに登録する必要があります。

org.springframework.boot.env.EnvironmentPostProcessor=com.example.YourEnvironmentPostProcessor 

私のやり方がApplicationEnvironmentPreparedEventリスナーを追加するために常にだった:

public class IntegrationTestBootstrapApplicationListener implements 
    ApplicationListener<ApplicationEnvironmentPreparedEvent>, Ordered { 

    public static final int DEFAULT_ORDER = Ordered.HIGHEST_PRECEDENCE + 4; 
    public static final String PROPERTY_SOURCE_NAME = "integrationTestProps"; 

    private int order = DEFAULT_ORDER; 

    public void setOrder(int order) { 
     this.order = order; 
    } 

    @Override 
    public int getOrder() { 
     return this.order; 
    } 

    @Override 
    public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) { 
     ConfigurableEnvironment environment = event.getEnvironment(); 

     if (!environment.getPropertySources().contains(PROPERTY_SOURCE_NAME)) { 
      Map<String, Object> properties = ...; // generate the values 

      // use whatever precedence you want - first, last, before, after 
      environment.getPropertySources().addLast(
       new MapPropertySource(PROPERTY_SOURCE_NAME, properties)); 
     } 
    } 

} 

をしかし、あなたは同じように簡単に初期化子を使用することができます。

public class IntegrationTestBootstrapApplicationListener implements 
    ApplicationContextInitializer<ConfigurableApplicationContext> { 

    private static final String PROPERTY_SOURCE_NAME = "integrationTestProps"; 

    @Override 
    public void initialize(final ConfigurableApplicationContext applicationContext) { 
     ConfigurableEnvironment environment = applicationContext.getEnvironment(); 
     Map<String, Object> properties = ...; // generate the values 

     // use whatever precedence you want - first, last, before, after 
     environment.getPropertySources().addLast(
      new MapPropertySource(PROPERTY_SOURCE_NAME, properties)); 
    } 
} 
+0

あなたのイニシャライザを検出するためにspringを記述することはできますか?このクラスはどこで使用されていますか? –

+0

引用されたテキストにはすでに説明があります。詳細は箇条書きのリストを参照してください。 –