讓Struts2與Spring進行整合原因及原理
Struts2與Spring進行整合的根本目的就是要讓 Spring為Struts2的Action注入所需的資源物件,它們整合的原理則是隻要匯入了struts2的spring外掛包,不需要進行任何額外的配置,Struts2的Action例項物件將由struts2的spring外掛建立,該外掛會按照Action的屬性名稱自動從spring容器中查詢相同名稱的bean物件對Action進行裝配,
顯然,Struts2的spring外掛需要獲得spring容器物件,這個spring容器物件是誰創建出來?Struts2的Spring外掛又是如何獲得Spring容器的呢?在web開發方面,Spring除了提供自己的spring mvc這個web框架之外,它也為web開發提供了最基本的支援,以便在不使用spring mvc的web環境下使用spring,這就是通過 org.springframework.web.context.ContextLoaderListener創建出 WebApplicationContext容器物件,
並將創建出來的WebApplicationContext物件儲存進了Web應用程式的application作用域中,儲存時的key為 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE這個常量表示的字串,以後在Web應用程式中就可以使用 application.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) 語句, 或Spring提供的工具方法
WebApplicationContextUtils.getWebApplicationContext(application)來獲得 spring容器物件。ContextLoaderListener使用contextConfigLocation這個ServletContext初始化引數來指定WebApplicationContext容器物件的配置檔案,如果沒有配置contextConfigLocation這個 ServletContext的初始化引數,ContextLoaderListener則預設使用/WEB-INF
/applicationContext.xml作為配置檔案。 為了簡便,我們這裡採用預設的配置檔案,所以,不需要配置contextConfigLocation這個ServletContext的初始化引數,只需要保證spring配置檔案的路徑和名稱為/WEB-INF/applicationContext.xml即可。為了以後能輕鬆編寫出spring整合hibernate的配置檔案,最好的辦法還是在已有的配置檔案基礎上進行修改,所以,我們就直接將petclinic的WEB-INF目錄下的 applicationContext-hibernate.xml檔案拷貝進自己的web專案中,
並改名為applicationContext.xml,然後參照petclinic的web.xml的內容修改自己的web專案中的web.xml檔案,即將petclinic的web.xml檔案中的如下一段內容複製到自己的web.xml檔案中:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
以下內容來自於:http://tech.sina.com.cn/s/2008-07-04/1102720177.shtml
Struts2與Spring的整合要用到Spring外掛包,這個包是同Struts2一起釋出的。Spring外掛是通過覆蓋(override)Struts2的ObjectFactory來增強核心框架物件的建立。當建立一個物件的時候,它會用Struts2配置檔案中的class屬性去和Spring配置檔案中的id屬性進行關聯,如果能找到則由Spring建立,否則由Struts2框架自身建立,然後由Spring來裝配。Spring外掛具體有如下幾個作用:
1. 允許spring來建立Action、Interceptror和Result
2. 由Struts建立的物件能夠被Spring裝配
3. 提供了2個攔截器來自動裝配action,如果沒有使用Spring ObjectFactory的話
這裡要注意的是,我們不必在Spring中去註冊action,儘管我們可以這麼去做,通常Struts框架會自動的從action mapping中建立action物件。
要實現與Struts與Spring的整合有如下幾步
1.將struts2-spring-plugin-2.0.8.jar檔案包含到我們的應用中,放到WEB-INF/lib目錄下面即可。在這個外掛包中有個struts-plugin.xml檔案,它的內容如下:
<struts><bean type="com.opensymphony.xwork2.ObjectFactory" name="spring"class="org.apache.struts2.spring.StrutsSpringObjectFactory"/><constant name="struts.objectFactory" value="spring"/><package name="spring-default"><interceptors><interceptor name="autowiring"class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/><interceptor name="sessionAutowiring"class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/></interceptors></package></struts>
這裡它將框架常量struts.objectFactory覆蓋了,設定為”spring”,其實這裡是使用了縮寫,我們可以寫全稱:org.apache.struts2.spring.StrutsSpringObjectFactory。這個縮寫的”spring”是和bean配置中的name屬性相對應的。預設情況下所有由框架建立的物件都是由ObjectFactory例項化的,ObjectFactory提供了與其它IoC容器如Spring、Pico等整合的方法。覆蓋這個ObjectFactory的類必須繼承ObjectFactory類或者它的任何子類,並且要帶有一個不帶引數的構造方法。在這裡我們用org.apache.struts2.spring.StrutsSpringObjectFactory代替了預設的ObjectFactory。
此外,上面我們說了,如果action不是使用Spring ObjectFactory建立的話,外掛提供了兩個攔截器來自動裝配action,預設情況下框架使用的自動裝配策略是name,也就是說框架會去Spring中尋找與action屬性名字相同的bean,可選的裝配策略還有:type、auto、constructor,我們可以通過常量struts.objectFactory.spring.autoWire來進行設定。