1. 程式人生 > >為什麼struts2呼叫service層在spring裡不用配置?

為什麼struts2呼叫service層在spring裡不用配置?

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配置檔案被裝載。