在Struts2中集成Spring詳細講解

轉載自http://java.ccidnet.com/art/3565/20070910/1206875_1.html


<listener>
                                <listener-class>                                                                org.springframework.web.context.ContextLoaderListener
                                </listener-class>
</listener>
Spring的官方定義是:一個輕量級的IoC和Aop容器框架,它使用了一種叫做依賴注入的技術。
所謂依賴注入,就是指將創建對象以及協議依賴對象之間合作的責任從對象自身中轉移到“工廠”中去,這個“工廠”通常由IoC容器提供。
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來進行設置。
2.配置Spring監聽器,將Spring.jar包包含到應用中
將下面一段話插入到web.xml文件中,同時將spring.jar文件放到WEB-INF/lib目錄下面。

<listener>

        <listener-class>

                org.springframework.web.context.ContextLoaderListener

        </listener-class>

</listener>

3.利用Spring配置文件來註冊對象
這之後的步驟就和我們使用單獨使用Spring一樣了,現在我們就已經完成了Struts與Spring的集成了。這裏有一點要注意的是,我們還要指定Spring配置文件的地點,默認情況下,容器會到WEB-INF目錄下面去尋找applicationContext.xml文件。如果我們想指定別的地方的配置文件或者指定多個配置文件,可以通過在web.xml文件中定義context-param元素來指定,如下所示:
<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
                /WEB-INF/applicationContext.xml,classpath:applicationContext-*.xml
        </param-value>
</context-param>

上面一段話表示WEB-INF下面的applicationContext.xml文件以及classpath下面的所有匹配applicationContext-*.xml模式的文件都會作爲Spring配置文件被裝載。











struts.objectFactory和struts.objectFactory.spring.autoWire

struts.objectFactory這個屬性用於說明Struts2的對象池創建工廠,Struts2也有自己的對象池,就像Spring那樣,在配置文中你可以引用對象池中的對象,你可以藉助於Spring中的對象池,當想要得到Spring中的對象池時,申明struts.objectFactory爲Spring的對象池構建工廠。當指定struts.objectFactory爲spring時,struts2框架就會把bean轉發給spring來創建,裝配,注入。但是bean創建完成之後,還是由struts容器來管理其生命週期。
在struts.xml中的代碼如下:<constant name="struts.objectFactory" value="spring" />
struts.objectFactory.spring.autoWire是用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對象。 
這樣就是讓spring去管理這些bean


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章