1. 程式人生 > >WEB啟動時,如何載入spring容器和struts2容器(bean的注入和url如何請求)

WEB啟動時,如何載入spring容器和struts2容器(bean的注入和url如何請求)

整合原理

整合原理:
   *  web.xml
      *  spring容器是以監聽器的形式與tomcat整合的
           <listener>
                <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
           </listener>
           <context-param>
                 <param-name>
contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext.xml</param-value> </context-param> * 以過濾器的形式整合struts2容器 * <filter> <filter-name>struts2</filter-name> <filter-class
>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter>

ContextLoaderListener 說明:

  • ContextLoaderListener 當中的createContextLoader()載入spring的web容器
  • initWebApplicationContext
    * 初始化spring的web容器
    * 載入其配置檔案
  • 當執行完這兩個方法以後,就啟動spring的web容器了,在spring容器中,單例模式的
    bean就被例項化了,所以dao和service層的物件和代理物件就在這個時候產生了

這裡寫圖片描述

在tomcat啟動的時候,幹了兩件事情:

  • 載入了各種配置檔案
  • 靜態注入了一些bean

這裡寫圖片描述

當發出 url 請求時 請求url:personAction_savePerson.action

步驟
* 先找struts的配置檔案,會找根據struts2的相關配置查詢action的建立方式
* 會去常量struts.objectFactory查詢到底是由哪個類建立了action
* 會去struts-default.xml,struts-plugin.xml,struts.xml檔案去找struts.objectFactory
* 哪個配置檔案載入在最後,哪個決定
* 最後在struts和spring整合的包中找到了struts-plugin.xml檔案
* <bean type="com.opensymphony.xwork2.ObjectFactory"
* name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
<constant name="struts.objectFactory" value="spring" />

* 由上述的內容可以知道,action是由StrutsSpringObjectFactory建立的,而該類繼承了SpringObjectFactory

這裡寫圖片描述

該原始碼中beanName就是struts2配置檔案中的action元素的class屬性的值,這就意味著
class屬性的值要和spring容器中action所在的bean所指定的id值要一致
如下圖
這裡寫圖片描述

這裡寫圖片描述