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

Guice 整合 Struts 2 實戰教學:從核心概念到完整範例

     編輯:Java 相關知識

Google Guice 是輕量級依賴注入 (DI) 框架,榮獲 Jolt 大獎。相較 Spring,Guice 無 XML 設定、純 Java 程式碼定義綁定、啟動更快。本文示範 Guice 核心運作與 Struts 2 整合完整流程。

一、Guice 核心概念

  • Module:實作 com.google.inject.Module 介面,在 configure(Binder) 方法中定義介面與實作類別綁定關係
  • @Inject:標註需注入的建構子、方法、欄位
  • Injector:由 Guice.createInjector(module) 建立,負責物件圖構建與依賴注入

二、所需 JAR 套件

Guice 核心:

  • guice-2.0.jar
  • aopalliance.jar

Web/Struts 2 整合:

  • guice-servlet-2.0.jar
  • guice-struts2-plugin-2.0.jar

Struts 2 核心:

  • struts2-core-2.1.6.jar
  • xwork-2.1.2.jar
  • ognl-2.6.11.jar
  • freemarker-2.3.13.jar
  • commons-fileupload-1.2.1.jar
  • commons-io-1.3.2.jar
  • commons-logging-1.0.4.jar

三、專案結構與程式碼

com.greysh.guice
├── action
│   └── UserAction.java
├── config
│   └── ModuleConfig.java
├── model
│   └── User.java
└── service
    ├── UserService.java
    └── impl
        └── UserServiceImpl.java

1. 實體類別 User.java

package com.greysh.guice.model;
public class User {
    private String userName;
    public String getUserName() { return userName; }
    public void setUserName(String userName) { this.userName = userName; }
}

2. Service 介面與實作

package com.greysh.guice.service;
import com.greysh.guice.model.User;
public interface UserService {
    void invoke(User user);
}
package com.greysh.guice.service.impl;
import com.greysh.guice.model.User;
import com.greysh.guice.service.UserService;
public class UserServiceImpl implements UserService {
    public void invoke(User user) {
        user.setUserName("Name : " + user.getUserName());
    }
}

3. Module 設定類別(核心綁定定義)

package com.greysh.guice.config;
import com.google.inject.*;
import com.greysh.guice.service.*;
import com.greysh.guice.service.impl.*;
import com.greysh.guice.model.User;
import com.greysh.guice.action.UserAction;

public class ModuleConfig implements Module {
    public void configure(Binder binder) {
        // 介面綁定實作,單例範圍
        binder.bind(UserService.class).to(UserServiceImpl.class).in(Scopes.SINGLETON);
        // 實體類別也納入管理
        binder.bind(User.class).in(Scopes.SINGLETON);
        // Action 類別綁定
        binder.bind(UserAction.class).in(Scopes.SINGLETON);
    }
}

4. Action 類別(欄位注入)

package com.greysh.guice.action;
import com.google.inject.Inject;
import com.greysh.guice.model.User;
import com.greysh.guice.service.UserService;
import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {
    @Inject private UserService userService;
    @Inject private User user;

    public String execute() {
        userService.invoke(user);
        return SUCCESS;
    }
    // Getter/Setter 供 OGNL 存取
    public User getUser() { return user; }
    public void setUser(User user) { this.user = user; }
}

四、Struts 2 整合設定 (struts.xml)

<!DOCTYPE struts PUBLIC
 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
 "https://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.objectFactory" value="guice" />
<constant name="struts.i18n.encoding" value="utf8" />
<constant name="guice.module" value="com.greysh.guice.config.ModuleConfig" />

<package name="default" extends="struts-default">
<action name="userAction" class="com.greysh.guice.action.UserAction">
<result name="success">/result.jsp</result>
</action>
</package>
</struts>

關鍵三常數:

  1. struts.objectFactory=guice:指定物件工廠為 Guice,取代 Struts 內建 DI
  2. guice.module:指定 Module 實作類別全名
  3. struts.i18n.encoding:編碼設定

五、Guice vs Spring 核心差異速查

面向SpringGuice
設定方式XML + 註解純 Java 程式碼 (Module)
注入觸發容器啟動時完整注入使用時即時注入 (Lazy)
類別侵入性低 (非侵入)高 (@Inject 標註業務碼)
動態綁定困難 (XML 靜態)原生支援 (程式碼邏輯)
生態系龐大 (ORM, AOP, MVC, Security...)專注 DI、AOP、Servlet 擴充
學習曲線平緩陡峭 (需懂泛型、註解、Module 模式)

六、Guice 適用場景建議

  • 輕量級專案、微服務、啟動速度敏感系統
  • 偏好程式碼優於 XML、享受 IDE 重構支援的團隊
  • 需動態綁定、條件式注入的複雜依賴圖
  • 不需 Spring 全家桶功能(JPA、Batch、Security、Cloud...)的專案

七、結語

Guice 以「程式碼即設定」哲學,提供極致輕量的 DI 體驗。整合 Struts 2 僅需三個常數設定與 Module 類別,即可享受型別安全、重構友善、啟動極快的依賴管理。選擇 Guice 或 Spring,取決於專案規模、團隊偏好與生態系需求——適合的才是最好的。

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