web-dev-qa-db-ja.com

Java Spring multiple ApplicationContext

スプリングの定義ApplicationContextは非常に曖昧です。チュートリアルの本はほぼ完成しましたが、ApplicationContextの略を理解することはできません。

Spring APIによると、ApplicationContextは次のとおりです。

  • アプリケーションの構成を提供する中央インターフェイス。これは、アプリケーションの実行中は読み取り専用ですが、実装がこれをサポートしている場合は再読み込みできます。

  • Spring Beanコンテナにアクセスするためのルートインターフェイス。これは、Beanコンテナの基本的なクライアントビューです。

上記から、私の質問は次のとおりです。

1)「コンテナ」と書かれた本を見続けていますが、コンテナとは何ですか? 1つのコンテナは、1つのJava process?か、1つのコンテナが1つのApplicationContextオブジェクトを参照するか?

2)2つのApplicationContextを1つJavaアプリケーション(両方ともmain body)にインスタンス化する場合)、これら2つのインターフェイスは1つの中央コンテナにありますか?または2つの別個のインスタンス以下のコードを参照してください、context1context2の違いは何ですか?Beans.xmlにシングルトンがある場合、context1context2によって呼び出されます。 、それらは2つの別々のインスタンスですか、それとも同じインスタンスですか?

ApplicationContext context1 = new ClassPathXmlApplicationContext("Beans.xml");
ApplicationContext context2 = new ClassPathXmlApplicationContext("Beans.xml");
22
GMsoF

コンテナごとに、コアスプリングを参照します コントロールコンテナの反転 。コンテナは、 reflection を使用して、アプリケーションを初期化/ブートストラップ(xmlファイルまたは注釈に構成をロード)し、Javaのライフサイクルを管理する方法を提供しますbeansまたは管理対象オブジェクトと呼ばれるオブジェクト。

この初期段階では、アプリケーションで(通常はまだ可能ですが)制御することはできません。代わりに、ブートストラップが完了すると(または失敗した場合は何もしない)、アプリケーションの完全に初期化された状態になります。

これは、EJB3 containerと呼ばれるものの代替、または場合によっては追加です。しかし、スプリングは、EJB定義の標準に準拠していないことを提供します。歴史的に、EJBの採用はその仕様の複雑さによって制限されてきました。Springは、EJB3同等の機能をJ2SE jvmで実行し、EJBコンテナなしで、はるかに簡単に構成できるプロジェクトです。

ApplicationContextinterface として、および直接実装フレーバーによる)は、現在(まばらに使用されている)BeanFactoryとは対照的に、このIoCコンテナーを実装する手段です より直接的なway 管理Bean。これは、ApplicationContextの基本実装機能を提供します。

2番目の質問にあるように、ApplicationContextの複数のインスタンスを持つことができます。その場合、それぞれが独自の構成を持つ完全に分離されます。

14
guido

最初の質問:

1)「コンテナ」と書かれた本を見続けていますが、コンテナとは何ですか? 1つのコンテナは、1つのJava process?または1つのコンテナが1つのApplicationContextオブジェクトを参照することを意味しますか?

ApplicationContextは中心的なインターフェイスですが、基になるコンテナはBeanFactoryです。より正確には、BeanFactoryは、Beanを取得するすべてのアプリケーションコンテキストによって実装される低レベルのインターフェイスです。その意味で、WordcontainerBeanFactory(ApplicationContextごとに1つ)を表していると思います。

2)1つのJavaアプリケーション(1つの本体)で2つのApplicationContextをインスタンス化する場合、これらの2つのインターフェイスは1つの中央コンテナですか?2つの別々のインスタンスですか?以下のコードを参照してください、違いは何ですか? context1とcontext2の間?Beans.xmlにシングルトンがある場合、context1とcontext2によって呼び出されます。それらは2つの別々のインスタンスですか、それとも同じインスタンスですか?

ApplicationContext context1 = new ClassPathXmlApplicationContext( "Beans.xml"); ApplicationContext context2 = new ClassPathXmlApplicationContext( "Beans.xml");>

そのインスタンス化により、2つの完全に独立したアプリケーションコンテキストが得られます。最初に宣言された1つのBeanは、もう1つでは見つかりません。

[〜#〜] but [〜#〜]

SpringにはApplicationContextの階層という概念があるため、Webアプリケーションには複数のアプリケーションコンテキストが存在するのが一般的です。次のように宣言できます。

ApplicationContext context1 = new ClassPathXmlApplicationContext("Beans.xml");
ApplicationContext context2 = new ClassPathXmlApplicationContext("Beans.xml", context1);>

ここでは、context1で宣言されたBeanのみを取得できますが、context2からはcontext2andcontext1からBeanを取得できます。具体的には、Beanは最初にcontext2で検索され、見つからない場合はcontext1で検索されます。

これは通常、MVC DispatcherServletに直接関連しないすべてのBeanのルートコンテキストと、コントローラーのBeanを含むDispatcherServlet専用の1つの子コンテキストを持つSpring MVCで使用されます。 、ビュー、インターセプターなど.

20
Serge Ballesta

「コンテナ」と書かれた本を見続けていますが、コンテナとは何ですか? 1つのコンテナは、1つのJava process?または1つのコンテナが1つのApplicationContextオブジェクトを参照することを意味しますか?

ここで、コンテナとは、ApplicationContext以外のスプリングコンテナを意味します。これは内部的にスプリング設定を読み取り、設定に基づいてクラスをロードします。 Bean初期化、インジェクション、i18n、Bean後処理などのさまざまな機能を既製のSpringProcessorとして考えることができます。

ApplicationContext context1 = new ClassPathXmlApplicationContext( "Beans.xml"); ApplicationContext context2 = new ClassPathXmlApplicationContext( "Beans.xml");

Conatinersが2つあるため、シングルトンBeanが2つあります。ここで、シングルトンはコンテナごとのシングルトンインスタンスを意味します。理想的な理由は、2つの理由がある場合を除いて、1つのコンテナのみです。学習目的のために、概念を理解することは理にかなっています

5
M Sach

ApplicationContextは、Springコンテナの実装です。簡単に言えば、SpringコンテナはApplicationContextを介してSpringアプリケーション全体を管理します。 ApplicationContextを介したSpringコンテナは、Spring Beanのライフサイクル、つまり開始から破棄までを管理します。

スプリングコンテナはJ2EEコンテナ内にネストされます。

「コンテナ」と書かれた本を見続けていますが、コンテナとは何ですか? 1つのコンテナは、1つのJava process?または1つのコンテナが1つのApplicationContextオブジェクトを参照することを意味しますか?

コンテナは、オブジェクトのライフサイクルを管理します。 Tomcatはコンテナの一例です。 SpringコンテナがApplicationContextを介してアプリを管理するように、J2EEコンテナTomcatはweb.xmlを介してアプリを管理します

コンテナは通信サポートを提供します。 Webアプリケーションのセキュリティ。 JSPサポート、国際化、イベント伝播、その他多くの機能。マルチスレッドをサポートし、リソースに対するリクエストごとに新しいスレッドを生成します。そのためのコードを明示的に記述する必要はありません。スプリングコンテナと同様に、J2eeコンテナはサーブレットのライフサイクルを管理します。

1つのJavaアプリケーション(1つの本体)に2つのApplicationContextをインスタンス化する場合、これらの2つのインターフェイスは1つの中央コンテナーにありますか?

アプリケーションで複数のApplicationContextをインスタンス化する場合。親子階層になります。ルートApplicationContextが1つあり、すべてのDispatcherServletにそれぞれ対応する子ApplicationContextがあります。アプリケーションに対してグローバルなBeanは、ルートApplicationContextで定義されます。すべてのApplicationContextsは、1つのスプリングコンテナによってのみ管理されます。

2
underdog

1)コンテナはJavaオブジェクト、ClassPathXmlApplicationContextのようなApplicationContext実装の1つのインスタンスです。

2)2つの異なるコンテナです。Beans.xmlにシングルトンBean B1がある場合、context1.getBean( "B1")およびcontext2.getBean( "B1")はB1の2つの異なるインスタンスを返します。

1

「Java-ee」タグを追加しました。 Springは、アプリケーションサーバーで実行されるWebアプリケーションでよく使用されます。通常、各Webアプリケーションには独自のアプリケーションがあります。 Webアプリケーションは分離されており、さまざまなアプリケーション/コンテナと変数を定期的に共有できないため、ドキュメントではおそらくコンテナと呼ばれています。

アプリケーション内で2つのコンテキストを使用できます。 2つのコンテキストがある場合、それぞれに独自のシングルトンがあります。

0
Udo Held