SpringにおけるWebApplicationContextの研究
ApplicationContextはSpringの中核であり、Contextは通常コンテキスト環境として解釈されているので、「コンテナ」で表現したほうが理解しやすいと思います.ApplicationContextは「適用されたコンテナ」です.P、SpringはBeanをこのコンテナに入れ、必要に応じてgetBeanメソッドで取り出します.この部分のソースコードを見たことはありませんが、しかし、それはMapのような構造だと思います.Webアプリケーションでは、WebApplicationContextを使用します.WebApplicationContextはApplicationContextから継承されています.まず、WebアプリケーションでWebApplicationContextをどのように初期化するかを見てみましょう.xmlで定義:
二つの方法があります.一つはContextLoaderListenerというListenerで、もう一つはContextLoaderServiceというサーブレットです.この二つの方法はwebアプリケーションの起動時にWebApplicationContextを初期化することです.個人的にはListenerはサーブレットよりも優れていると思います.Listenerはアプリケーションの起動と終了を傍受しているので、サーブレットは起動を少し遅らせる必要がありますが、この場合、いくつかの業務の操作を行う場合は、起動の前後の順序に影響があります.ではContextLoaderListenerとContextLoaderServiceではいったい何をしているのでしょうか.ContextLoaderListenerを例にとると
WebApplicationContextを初期化するためのツールクラスです.その主な方法はinitWebApplicationContextです.initWebApplicationContextという方法を追跡し続けます(具体的なコードは貼らないので、Springのソースコードを見ることができます).元々ContextLoaderはWebApplicationContext(XmlWebApplicationContextはデフォルト実装クラス)をサーブレットContextに入れていたが、サーブレットContextも「コンテナ」であり、Mapのような構造であったが、WebApplicationContextのサーブレットContextにおけるKEYはWebApplicationContextであった.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE、WebApplicationContextを使用するにはサーブレットContextから取り出す必要があります.SpringはWebApplicationContextUtilsクラスを提供しています.WebApplicationContextを簡単に取り出すことができます.サーブレットContextを入力すればいいです.WebApplicationContextがサーブレットコンテナで初期化する原理をご紹介しましたが、一般的なWebアプリケーションでは簡単に使用できますが、Strutsの広範な応用に伴い、StrutsとSpringを全体として、直面すべき問題であり、Spring自体もStrutsの関連クラスに提供され、主にorgが使用されています.springframework.web.struts.ActionSupportは、自分のActionをActionSupportから引き継ぐだけで、ActionSupportのgetWebApplicationContext()を呼び出す方法でWebApplicationContextを取り出すことができますが、このようにActionでは、ビジネスロジックを取得する必要がある場所はgetBeanで、簡潔ではないように見えますので、Springはorgを使う別の方法を提供しています.springframework.web.struts.ContextLoaderPlugIn、これはStrutsのPlugである、Struts起動時にロードされ、Actionに対してはBeanを管理するように管理することができ、struts-config.xmlでのActionの構成は以下のようになります
com.web.action.AactionはActionの実装クラスであり、ビジネスサービスは必要なビジネスロジックであり、SpringはビジネスサービスをActionに注入し、Actionではビジネスサービスのgetとsetメソッドを書くだけでよい.もう一つ、actionのbeanはsingleton=「false」であり、すなわちインスタンスを新規作成するたびに、StrutsにおけるActionのスレッド同期の問題も解決する.具体的には、ユーザが「/aAction」のHTTP要求(当然「/aAction.do」であるべき)をすると、StrutsはそのActionの対応クラスorgを見つける.springframework.web.struts.DelegatingActionProxy、DelegatingActionProxyはエージェントクラスで、action-servletを探しに行きます.xmlファイルの「/aAction」に対応する真の実装クラスをインスタンス化し、必要なビジネスオブジェクトを注入してActionのexecuteメソッドを実行します.ContextLoaderPlugInを使用してstruts-config.xmlではこのような構成になります
WebではxmlではContextLoaderListenerまたはContextLoaderServiceletは不要です.ここまで言うと、ContextLoaderPlugInを使用すると、StrutsのAction環境から離れたプログラムがある場合、タグライブラリをカスタマイズするなど、タグライブラリでSpring管理のビジネス層の論理オブジェクトを呼び出す必要があります.この場合、私たちは面倒です.アクションにビジネスロジックを動的に注入するだけなので、SpringのWebApplicationContextは他に取得できないようです.急いではいけません.ContextLoaderPlugInのソースコードを見てみましょう.ContextLoaderPlugInはWebApplicationContextをサーブレットContextに置いていましたが、このKEYは違います.このKEY値はContextLoaderPlugInです.SERVLET_CONTEXT_PREFIX+ModuleConfig.getPrefix()(具体的にはソースコードを参照してください)、これでいいです.WebApplicationContextはどこに置いてあるか分かりました.WebアプリケーションでサーブレットContextを取ればWebApplicationContextも取れます.Springは強力なフレームワークです.使用中に絶えず深く入り込んで、より多くの特性を理解してほしいです.私はここでレンガを投げて玉を引いています.何か悪いところがありましたら、ご指摘ください.http://blog.laoer.com/blog.do?id=1
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- OR USE THE CONTEXTLOADERSERVLET INSTEAD OF THE LISTENER
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
-->
二つの方法があります.一つはContextLoaderListenerというListenerで、もう一つはContextLoaderServiceというサーブレットです.この二つの方法はwebアプリケーションの起動時にWebApplicationContextを初期化することです.個人的にはListenerはサーブレットよりも優れていると思います.Listenerはアプリケーションの起動と終了を傍受しているので、サーブレットは起動を少し遅らせる必要がありますが、この場合、いくつかの業務の操作を行う場合は、起動の前後の順序に影響があります.ではContextLoaderListenerとContextLoaderServiceではいったい何をしているのでしょうか.ContextLoaderListenerを例にとると
public void contextInitialized(ServletContextEvent event) {
this.contextLoader = createContextLoader();
this.contextLoader.initWebApplicationContext(event.getServletContext());
}
protected ContextLoader createContextLoader() {
return new ContextLoader();
}
ContextLoader
WebApplicationContextを初期化するためのツールクラスです.その主な方法はinitWebApplicationContextです.initWebApplicationContextという方法を追跡し続けます(具体的なコードは貼らないので、Springのソースコードを見ることができます).元々ContextLoaderはWebApplicationContext(XmlWebApplicationContextはデフォルト実装クラス)をサーブレットContextに入れていたが、サーブレットContextも「コンテナ」であり、Mapのような構造であったが、WebApplicationContextのサーブレットContextにおけるKEYはWebApplicationContextであった.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE、WebApplicationContextを使用するにはサーブレットContextから取り出す必要があります.SpringはWebApplicationContextUtilsクラスを提供しています.WebApplicationContextを簡単に取り出すことができます.サーブレットContextを入力すればいいです.WebApplicationContextがサーブレットコンテナで初期化する原理をご紹介しましたが、一般的なWebアプリケーションでは簡単に使用できますが、Strutsの広範な応用に伴い、StrutsとSpringを全体として、直面すべき問題であり、Spring自体もStrutsの関連クラスに提供され、主にorgが使用されています.springframework.web.struts.ActionSupportは、自分のActionをActionSupportから引き継ぐだけで、ActionSupportのgetWebApplicationContext()を呼び出す方法でWebApplicationContextを取り出すことができますが、このようにActionでは、ビジネスロジックを取得する必要がある場所はgetBeanで、簡潔ではないように見えますので、Springはorgを使う別の方法を提供しています.springframework.web.struts.ContextLoaderPlugIn、これはStrutsのPlugである、Struts起動時にロードされ、Actionに対してはBeanを管理するように管理することができ、struts-config.xmlでのActionの構成は以下のようになります
<action attribute="aForm" name="aForm" path="/aAction" scope="request" type="org.springframework.web.struts.DelegatingActionProxy">
<forward name="forward" path="forward.jsp" />
</action>
type org.springframework.web.struts.DelegatingActionProxy, action-servlet.xml ,action-servlet.xml Spring spring-beans.dtd ,
<bean name="/aAction" class="com.web.action.Aaction" singleton="false">
<property name="businessService">
<ref bean="businessService"/>
</property>
</bean>
com.web.action.AactionはActionの実装クラスであり、ビジネスサービスは必要なビジネスロジックであり、SpringはビジネスサービスをActionに注入し、Actionではビジネスサービスのgetとsetメソッドを書くだけでよい.もう一つ、actionのbeanはsingleton=「false」であり、すなわちインスタンスを新規作成するたびに、StrutsにおけるActionのスレッド同期の問題も解決する.具体的には、ユーザが「/aAction」のHTTP要求(当然「/aAction.do」であるべき)をすると、StrutsはそのActionの対応クラスorgを見つける.springframework.web.struts.DelegatingActionProxy、DelegatingActionProxyはエージェントクラスで、action-servletを探しに行きます.xmlファイルの「/aAction」に対応する真の実装クラスをインスタンス化し、必要なビジネスオブジェクトを注入してActionのexecuteメソッドを実行します.ContextLoaderPlugInを使用してstruts-config.xmlではこのような構成になります
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml" />
</plug-in>
WebではxmlではContextLoaderListenerまたはContextLoaderServiceletは不要です.ここまで言うと、ContextLoaderPlugInを使用すると、StrutsのAction環境から離れたプログラムがある場合、タグライブラリをカスタマイズするなど、タグライブラリでSpring管理のビジネス層の論理オブジェクトを呼び出す必要があります.この場合、私たちは面倒です.アクションにビジネスロジックを動的に注入するだけなので、SpringのWebApplicationContextは他に取得できないようです.急いではいけません.ContextLoaderPlugInのソースコードを見てみましょう.ContextLoaderPlugInはWebApplicationContextをサーブレットContextに置いていましたが、このKEYは違います.このKEY値はContextLoaderPlugInです.SERVLET_CONTEXT_PREFIX+ModuleConfig.getPrefix()(具体的にはソースコードを参照してください)、これでいいです.WebApplicationContextはどこに置いてあるか分かりました.WebアプリケーションでサーブレットContextを取ればWebApplicationContextも取れます.Springは強力なフレームワークです.使用中に絶えず深く入り込んで、より多くの特性を理解してほしいです.私はここでレンガを投げて玉を引いています.何か悪いところがありましたら、ご指摘ください.http://blog.laoer.com/blog.do?id=1