0

現在、既存のアプリケーションを Spring Boot 1.2 に移行する作業を行っています (Mule 3 を使用しています。Spring 4.2 とは互換性がありません)。このアプリケーションには、Bean 定義を含むアプリケーションに含まれる XML ファイルを読み取ることによっていくつかの ClasspathXmlApplicationContexts を作成することにより、Mule ブートストラップ プロセスを実行するライブラリ提供の (私は変更できません) サーブレットが含まれています。

私の問題は、この XML ファイルには、アクティブなプロファイルに基づいて異なる方法で解決する必要があるいくつかのプレースホルダーが含まれていることです (そして、これらの変数を異なるプロファイルで application.yml ファイルに保存しました)。新しいアプリケーション コンテキストによって作成された StandardEnvironments。

YML ファイルを .properties ファイルに変換し、この各 XML ファイル内に同じ application-#{systemProperties['spring.profiles.active']}.properties を指す新しい PropertyPlaceholderConfigurer を作成できますが、次のようになります。

  1. 慣習と優先順位を使用して .properties ファイルをさまざまな内部/外部の場所に配置する Boot の柔軟性が失われます。これは、さまざまな環境に移行するアプリケーションにとって便利に思えます。

  2. 同じ定義を何度か追加する必要がある場合は、無視しているプログラムによる方法があると思います。

それらを作成するクラスを変更するアクセス権を持たずに、新しく作成されたすべての ApplicationContexts に applicationConfig PropertySource のコンテンツを追加する方法を知っている人はいますか? Spring Boot 1.2 には、これを行うための EnvironmentPostProcessor の素晴らしさはありません。

4

2 に答える 2

0

新しいコンテキストを作成すると、メイン環境からのすべてのプロパティ ソースを、次のようなものを使用して新しく作成されたコンテキストに追加できます。

public AnnotationConfigApplicationContext createNewApplicationContext(ConfigurableEnvironment mainEnv) throws IOException {
AnnotationConfigApplicationContext newContext = new AnnotationConfigApplicationContext();
//Add scan for your packages
newContext.scan("com.abc.mycompany");
//Also Any different profile in association with new context can be added newContext.getEnvironment().addActiveProfile("newProfile");
mainEnv.getPropertySources().stream().filter(propertySource -> propertySource.getName().startsWith("applicationConfig")).forEach(newContext.getEnvironment().getPropertySources()::addLast);
newContext.refresh();
return newContext;
}

これで、好きなだけコンテキストを作成できます。また、すべての Bean 作成の最後にこれを処理するには、@PostConstruct を使用して、この新しいコンテキスト生成関数を呼び出すラッパー メソッドを記述します。

于 2020-12-11T11:20:32.803 に答える