8

1 つの親コンテキストを持つ複数の Spring コンテキストを作成します。親コンテキストを作成する方法は次のとおりです。

new ClassPathXmlApplicationContext(new String[] {"ApplicationContext/application.xml"})

そして、次の方法で作成したい各親コンテキスト:

PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer();
configurer.setProperties(properties);
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(appContext);
context.addBeanFactoryPostProcessor(configurer);
context.setConfigLocation("ApplicationContext/beans.xml");
context.refresh();

アイデアは、それぞれに同じ Bean 階層を持つ複数の子コンテキスト (DAO、サービス、データ ソース、トランザクション マネージャーなど) を持つことです。複数のコンテキストを持つ理由は、複数の異なるデータ ソース (実際にはアプリケーション コンテキストごとに 1 つ) を持つ必要があるためです。各データ ソースのデータベース構造は同じです。それで、いくつか質問があります。

  1. そのようなコンテキストの階層を持つことは安全ですか? たとえば、30 の子コンテキストがあるとしますか?
  2. クロス子コンテキスト Bean の可視性についてはどうですか? たとえば、いくつかの自動配線された DAO 依存関係を持つ @Component アノテーションで宣言されたCustomerService Bean があるとします。Spring は、特定の子コンテキスト内でオートワイヤリングやその他の DI アクションを実行しますか?
  3. また、次のメソッドを使用して、子コンテキストから Bean を検索します。 childContext.getBean(CustomerService.class); 他の子コンテキストではなく、この特定の子コンテキストから顧客サービスを取得しますか? 春のシングルトンはアプリケーションコンテキストごとのシングルトンであることは知っていますが、まだわかりません。

PS。ここで説明する複数のデータ ソースを処理する別の方法があります。しかし、私の場合、このアプローチはあまり便利ではないようです。

4

1 に答える 1

13
  • そのようなコンテキストの階層を持つことは安全ですか? たとえば、30 個の子コンテキストがあるとしますか?

安全とはどういう意味ですか?Beanの初期化中にスレッドセーフを意味する場合は、コンテキストが1つずつ初期化されるため、そうです。

  • クロス子コンテキスト Bean の可視性についてはどうですか? たとえば、いくつかの自動配線された DAO 依存関係を持つ @Component アノテーションで宣言されたCustomerService Bean があるとします。Spring は、特定の子コンテキスト内でオートワイヤリングやその他の DI アクションを実行しますか?

Bean は、子コンテキスト全体では表示されません。コンテキストで表示される Bean は、それ自身の Bean とその親コン​​テキストの Bean だけです。

  • また、次のメソッドを使用して、子コンテキストから Bean を検索します。 childContext.getBean(CustomerService.class); 他の子コンテキストではなく、この特定の子コンテキストから顧客サービスを取得しますか? 春のシングルトンはアプリケーションコンテキストごとのシングルトンであることは知っていますが、まだわかりません。

はい。最後の質問への回答の通りです。

私は自分のアプリケーションでこのパターンを非常に広範囲に使用しています。親にすることで他の多くの子コンテキストによって共有される共通のコンテキストがあります。アプリケーションがマルチテナントの場合など、単一の JVM 内で完全に分離されたコンテキストを実行する場合に非常に便利です。その後、JVM を再起動せずに、アプリケーション コンテキストをテナントごとに開始/停止/再起動できます。

これにより、データ ソースとトランザクション マネージャーを明確に分離し、データベースを簡単にシャーディングすることもできます。

于 2013-01-14T09:24:59.350 に答える