2012-03-12 10 views
3

私はSpringを学んでいます。スタンドアロンアプリケーションでどのように使用するか(また、Webアプリケーションを作成するときにも)、私は質問があります。これまでコード化されている例では、単純なmainメソッドを使用していましたが、ここではgetBeanを呼び出してBeanを取得します。コンテキストオブジェクト。しかし、おそらく複数のクラスでこれをやりたがっているので、まずコンテキストを取得してからgetBeanを呼び出すか、他のよりクリーンな代替メソッドがありますか?それとも、スタンドアローンやウェブアプリでこれを行うのですか?スタンドアロンアプリケーションでSpringを使用する

答えて

7

どこでもcontext.getBean()を呼び出すならば、依存性注入フレームワークであるSpringの全体のポイントが不足している可能性があります。

スタンドアロンのアプリケーションでは、通常、「ルート」Beanを取得するために、context.getBean()を1回(または少なくともごくまれに)呼び出します。このBeanはSpringによって他のBeanなどとインジェクションされます。

ウェブアプリケーションでは、すべてのフレームワークを使用するかどうかによって異なります。しかし、通常、コンテキストをロードするweb.xmlにリスナーを登録し、コントローラはSpringによって作成および/または挿入されます。

+0

ああ、あなたはアプリケーションをブートストラップのためにそれを使用します。 – LuckyLuke

+0

はい、まさに、@ Thomasz Nurkiewiczsの答えに示されているとおりです。 –

+0

よろしくお願いいたします。私はDIフレームワークのポイントを見逃しているということをあなたが説明することができますか?私が読むことができるように。また、なぜあなたは一度だけそれを呼び出すと仮定されていますか? – LuckyLuke

1

コンテキストを作成するには、1つのクラス(メインクラス、おそらく)がSpring対応である必要があります。他のすべてのクラスは、Springを介して引き続き相互接続でき、コンテキストを認識する必要はありません。

1

これは、作成しているアプリケーションによって異なりますが、getBean()の呼び出しを最小限に抑えてください。最初のBeanをコンテキストから直接取り出し、残りのロジックをBean自体に入れます。線に沿って何か:

Bootstrap boot = context.getBean(Bootstrap.class); 
boot.start(); 

そして、あなたのアプリケーションロジックのすべての残りの部分がstart()内で行われます。スレッドを作成したり、イベントを聞いたりすることができます。

3

あなたは正しい行です。主な方法は、あなたが発見したアプリケーションコンテキストを初期化します。そのトリックは、そのアプリケーションコンテキストを使用してアプリケーションへのエントリポイントを作成することです。その豆は、春に作成されているあなたのために配線されています..

import org.springframework.beans.factory.BeanFactoryUtils; 
import org.springframework.context.support.AbstractApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 


public class ApplicationMain { 

    public static void main(String[] args) { 

     AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:/META-INF/spring/applicationContext.xml"); 

     MyApplication app = BeanFactoryUtils.beanOfType(ctx, MyApplication.class); 

     app.init(); 
    } 

} 
+0

私はちょうどアプリケーションのinit - メソッドとしてapp.initを設定します。このように、ルックアップと明示的な呼び出しは必要ありません。すべてが春に処理されます。 – Laures

+0

@Laures - これはもっと暗黙的にすることができますが、明示的な呼び出しが必要な場合があります。 Springには、ここで適用可能な 'org.springframework.context.Lifecycle'インターフェースがあります。アプリケーションコンテキストで 'start()'、 'stop()'または 'isRunning()'が呼び出されると、Lifecycleインタフェースを実装するすべてのBeanには、同等のメソッドが呼び出されます。このような簡単な例では、それは過度だと思います。 – sw1nn

関連する問題