SpringにおけるWebApplicationContextの研究


ApplicationContextはSpringの中核であり、Contextは通常コンテキスト環境として解釈されているので、「コンテナ」で表現したほうが理解しやすいと思います.ApplicationContextは「適用されたコンテナ」です.P、SpringはBeanをこのコンテナに入れ、必要に応じてgetBeanメソッドで取り出します.この部分のソースコードを見たことはありませんが、しかし、それはMapのような構造だと思います.Webアプリケーションでは、WebApplicationContextを使用します.WebApplicationContextはApplicationContextから継承されています.まず、WebアプリケーションでWebApplicationContextをどのように初期化するかを見てみましょう.xmlで定義:
<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