2009-07-27 2 views
2

私が理解しているように、Spring MVCアプリケーションには、applicationContext.xmlとdispatcher-servlet.xmlによってそれぞれ制御される2つの異なるコンテキスト、アプリケーションコンテキストとWebコンテキストがあります。BeanをSpring MVCのアプリケーションコンテキストにロードするにはどうすればよいですか?

私のコントローラ内でこれらのコンテキストのいずれかにBeanをロードするにはどうすればよいですか?

私はGetting Spring Application Contextを認識しています。それは、スタンドアロンアプリケーションのための私の質問に答えるだろう。私はxmlファイルからアプリケーションコンテキストをロードするためにファクトリを使用しますが、これはSpring MVCでBeanをロードする方法が間違っているようです。

+1

申し訳ありませんが、これはそれらの愚かな質問の一つであり、私は春101ある豆、ワイヤに忘れてしまったし、何が機能しなかった理由を不思議に思いました。うまくいけば、ここにある情報は初心者の助けになるだろうが、私は本当によく知っているはずだった。 –

答えて

4

Mattは間違いありません。どのような種類のBean読み込み/インスタンス化コードもMVCアプリケーションには必要ないはずです。さもなければ間違ったことをしています。春のXML設定ファイルの中に豆を定義します。

<bean id="pinboardServiceTarget" class="com.lifepin.services.PinboardService"> 
    <property name="pinboardEntryDao" ref="pinboardEntryDAO"/> 
</bean> 
... 
<bean id="pinboardEntryDAO" class="com.lifepin.daos.PinboardEntryDAO"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 

あなたPinboardServiceクラスは、(これはちょうど私が最近書いたアプリケーションからである)PinboardServiceクラス内で私はDAOインタフェースを使用していることをIPinboardEntryDAO

public class PinboardService implements IPinboardService{ 
    private IPinboardEntryDAO pinboardEntryDao; 

    ... 

    public void setPinboardEntryDAO(IPinboardEntryDAO dao){ 
    this.pinboardEntryDao = dao; 
    } 

    public IPinboardEntryDAO getPinboardEntryDAO(){ 
    ... 
    } 

    ... 
} 

public class PinboardEntryDAO implements IPinboardEntryDAO{ 
    ... 
} 

のような注意、ない性質を持っています実装自体は、私は実際の実装 PinboardEntryDAOを注入している構成中に。これは、さまざまなレイヤー(プレゼンテーション、サービス、データレイヤー)を分離するための非常に優れた方法です。

+0

Offtopic、私は接頭辞付きのインターフェース名で何をしていますか?あなたはspring .netなどを使っていますか? –

+0

あなたはインターフェイスの前に "I"を意味します。私はJavaと.Netを開発しています。私は個人的に実装クラスの "Impl"接尾辞よりも前に付いているインタフェースを好みます。 Eclipseはまた、この種のスタイルを多く使います。私の意見ではそれはもっと目に見えますが、それは単なる好みです。 – Juri

+0

命名標準を見ると、クラスは名詞、メソッドは動詞、インターフェースは形容詞、または名詞を変更する単語です。したがって、Carはドライブ可能であり、クラスはシリアライズ可能であり、Dataクラスはキャッシュ可能である、等である。http://www.ego4u.com/en/cram-up/grammar/adjectives-adverbs – jmort253

4

Spring MVCアプリケーションには2つの異なるコンテキストがありますが、WebコンテキストはアプリケーションコンテキストにロードされたすべてのBeanにアクセスできます。ただし、アプリケーションコンテキストはWebコンテキストのBeanにアクセスできません。これは懸念事項の分離を強制するために使用されます。ビジネスルールクラスはHTTPセッションについて知る必要はありません。したがって、Beanを持っている場合は、両方のコンテキストからのアクセスが必要です。アプリケーションコンテキスト内で宣言する必要があります。

+0

beanがapplicationContext.xmlに入ったら、どのようにBeanをロードしますか? –

+0

私は、アプリケーションに読み込まれたBeanにWebコンテキスト(http://stackoverflow.com/questions/888581/fixing-null-entitymanger-in-spring-mvc-application/889723#889723)からアクセスできないことがわかりました。たぶん@PersistanceContextアノテーションの問題です。 –

+0

私は実際には単一のコンテキストを使用するだけで簡単に見つけることができます。 web.xmlでは、コンテキスト・パラメータcontextConfigLocationがサーブレット・コンテキスト・ファイルを指し示すorg.springframework.web.context.ContextLoaderListenerを宣言します(これは、DAO、サービス、WebマッピングなどのためにXMLファイルをインポートします)。あなたが望むように多く)。次に、DispatcherServletを別のファイルを参照する代わりに、org.springframework.web.context.WebApplicationContext.ROOTの値を持つinit-param "contextAttribute"を使用してDispatcherServletを構成します。この結果、1つのapplicationContextになります –

1

コントローラが持つ依存関係(サービス層クラス、DAOなど)は、通常の注入、コンストラクタ注入またはセッタ注入のいずれかとして表現する必要があります。

コントローラーがマップされているコンテキストは、正常に必要な依存関係でワイヤリングされます。コントローラコードは、Beanを直接取得するためにSpringと直接操作する必要はありません。

+0

ああ、私は明らかに頭が柔らかいです。私はどこにいても豆の中に配線しておらず、なぜそれが機能していないのだろうと思っていませ何が明らかにすべきかを指摘していただきありがとうございます。私は前にSpringを扱ってきました。私は単なるスタンドアロンのコードを見てきました。 –

1

Beanをコントローラにロードするには、依存関係注入と設定ファイルを使用する必要がありますが、アプリケーションコンテキストに直接アクセスする必要がある場合は、AbstractController(またはその子孫)を拡張するコントローラはgetApplicationContext()メソッド。

+0

最終的に私の問題はBeanの配線にありましたが、getApplicationContext()メソッドを指摘していただきありがとうございます。それは後で便利になるかもしれません。 –

1

スタンドアロンアプリケーションでは、ユーザcontext.Refresh()を使用して、新しいリクエストされたBeanを再ロード/再インスタンス化します。古いBeanは古いインスタンスのみを持ちます。

我々はのContextLoaderListenerを上書きして(contextInitializedを呼び出す必要があり、Webアプリケーションで

1

新しいプロジェクトにサービス層(たとえば、サービスのcontext.xml)のBean定義を含むファイルをインポートする必要があります。次のように行うことができます。

<import resource="classpath:service-context.xml"/> 
関連する問題