Spring 作為輕量級 IoC/AOP 容器,通過依賴注入(DI)實現對象創建與依賴管理的解耦。Struts2 與 Spring 整合的核心在於讓 Spring 接管 Action、Interceptor、Result 等核心組件的創建與裝配。本文系統梳理整合原理、步驟及關鍵配置。
Struts2 Spring 插件(struts2-spring-plugin-xxx.jar)通過覆蓋 ObjectFactory 實現增強:
class 屬性匹配 Spring 配置的 id插件提供三大功能:
ActionAutowiringInterceptor 和 SessionContextAutowiringInterceptor 兩個攔截器實現自動裝配將 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 將默認工廠替換為 Spring 版本,簡寫 "spring" 對應 bean 的 name 屬性。
在 web.xml 中註冊 ContextLoaderListener,並確保 spring.jar 在 classpath:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
默認加載 WEB-INF/applicationContext.xml。如需自定義路徑或多文件,在 web.xml 配置:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml,classpath:applicationContext-*.xml</param-value> </context-param>
默認按 name 匹配(Action 屬性名 = Spring bean id)。可通過常量調整:
<constant name="struts.objectFactory.spring.autoWire" value="type" />
可選值:name(默認)、type、auto、constructor。
無需在 Spring 中顯式註冊 Action。Struts2 會根據 action mapping 自動創建 Action 實例,Spring 僅負責依賴注入。若在 Spring 中註冊 Action,需設置 scope="prototype" 確保每次請求新實例。
<action name="userLogin" class="userLoginAction"> <result name="success">/welcome.jsp</result> </action>
<bean id="userLoginAction" class="com.example.action.UserLoginAction" scope="prototype"> <property name="userService" ref="userService"/> </bean> <bean id="userService" class="com.example.service.UserServiceImpl"> <property name="userDao" ref="userDao"/> </bean>
struts.objectFactory 是否生效、Spring bean id 與 Action 屬性名是否一致SessionContextAutowiringInterceptor 或配置 scope="session" 配合 <aop:scoped-proxy/>Struts2-Spring 整合成熟穩定,關鍵在於理解 ObjectFactory 替換機制與自動裝配策略。按步驟配置即可實現無縫整合,享受 DI 帶來的鬆耦合架構優勢。