配置:
<!-- struts.xml -->
<constant name="struts.objectFactory" value="spring" />
<!-- 或 struts.properties -->
struts.objectFactory=spring
Action 映射:
<action name="user" class="com.myapp.admin.web.action.user.UserAction">...</action>
特點:Spring 以 prototype 作用域為每個請求創建新 Action 實例,依賴自動注入。Struts 仍控制生命周期。
Spring 配置 (applicationContext.xml):
<bean id="userAction" class="com.myapp.web.action.user.UserAction" scope="prototype">
<property name="userService" ref="userService"/>
</bean>
Struts 映射引用 Bean ID:
<action name="user" class="userAction">...</action>
Spring 默認 scope="singleton",而 Action 通常有狀態 (持有表單數據)。必須顯式聲明 scope="prototype",否則多線程並發時表單數據相互覆蓋,導致嚴重線程安全問題。
| 維度 | 層次 1 (Struts 生命周期) | 層次 2 (Spring 全托管) |
|---|---|---|
| Action 作用域 | Spring 強制 prototype | 手動配置 prototype (易忘) |
| AOP 支持 | 無 | 完整支持 (事務、日誌、權限) |
| Acegi/Spring Security | 受限 | 無縫整合 |
| 配置複雜度 | 低 | 中 (需雙邊配置) |
| 適用場景 | 簡單 CRUD、無橫切關注點 | 需聲明式事務、切面、安全控制 |
@Scope("prototype") 註解遷移提示:Struts 2.5+ 推薦使用 Convention Plugin 零配置,配合 Spring @Component 掃描,可完全省略 struts.xml 中的 action 映射。