首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Struts2 整合 Spring 完整指南

     編輯:Java 相關知識

Spring 作為輕量級 IoC/AOP 容器,通過依賴注入(DI)實現對象創建與依賴管理的解耦。Struts2 與 Spring 整合的核心在於讓 Spring 接管 Action、Interceptor、Result 等核心組件的創建與裝配。本文系統梳理整合原理、步驟及關鍵配置。

整合核心機制

Struts2 Spring 插件(struts2-spring-plugin-xxx.jar)通過覆蓋 ObjectFactory 實現增強:

  1. 攔截對象創建請求,優先用 Struts 配置的 class 屬性匹配 Spring 配置的 id
  2. 匹配成功 → Spring 創建並裝配對象
  3. 匹配失敗 → Struts2 自行創建,再由 Spring 進行屬性注入

插件提供三大功能:

  • 允許 Spring 創建 Action、Interceptor、Result
  • Struts 創建的對象可被 Spring 裝配
  • 提供 ActionAutowiringInterceptor 和 SessionContextAutowiringInterceptor 兩個攔截器實現自動裝配

整合步驟詳解

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 將默認工廠替換為 Spring 版本,簡寫 "spring" 對應 bean 的 name 屬性。

2. 配置 Spring 監聽器

在 web.xml 中註冊 ContextLoaderListener,並確保 spring.jar 在 classpath:

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

3. Spring 配置文件註冊對象

默認加載 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。

Action 註冊說明

無需在 Spring 中顯式註冊 Action。Struts2 會根據 action mapping 自動創建 Action 實例,Spring 僅負責依賴注入。若在 Spring 中註冊 Action,需設置 scope="prototype" 確保每次請求新實例。

完整配置示例

struts.xml

<action name="userLogin" class="userLoginAction">
  <result name="success">/welcome.jsp</result>
</action>

applicationContext.xml

<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 屬性名是否一致
  • 事務不生效:確保 Service 層方法有 @Transactional,且 Spring 掃描到事務管理器
  • Session 作用域 Bean 注入失敗:使用 SessionContextAutowiringInterceptor 或配置 scope="session" 配合 <aop:scoped-proxy/>

Struts2-Spring 整合成熟穩定,關鍵在於理解 ObjectFactory 替換機制與自動裝配策略。按步驟配置即可實現無縫整合,享受 DI 帶來的鬆耦合架構優勢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved