Google Guice 是以 JDK 1.5+ 為基礎的輕量級 DI 容器,核心優勢在於無 XML、純 Java 程式碼定義綁定、型別安全、IDE 重構友善。本文透過兩個漸進式範例快速上手。
四個檔案構成基本 DI 流程:
package com.test.guice;
public interface HelloGuice {
void sayHello();
}
package com.test.guice;
public class HelloGuiceImpl implements HelloGuice {
public void sayHello() {
System.out.println("Hello Guice!");
}
}
package com.test.guice;
import com.google.inject.Binder;
import com.google.inject.Module;
public class HelloGuiceModule implements Module {
public void configure(Binder binder) {
// 核心綁定:介面 → 實作
binder.bind(HelloGuice.class).to(HelloGuiceImpl.class);
}
}
package com.test.guice;
import junit.framework.TestCase;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class TestGuice extends TestCase {
public void testHelloGuice() {
// 1. 建立 Injector(載入 Module)
Injector injector = Guice.createInjector(new HelloGuiceModule());
// 2. 取得實例(自動注入依賴)
HelloGuice helloGuice = injector.getInstance(HelloGuice.class);
// 3. 驗證
helloGuice.sayHello(); // 輸出: Hello Guice!
}
}
在介面上直接宣告預設實作,Guice 會自動掃描並綁定,無需撰寫 Module 類別。
package com.test.guice;
import com.google.inject.ImplementedBy;
@ImplementedBy(HelloGuiceImpl.class)
public interface HelloGuice {
void sayHello();
}
public class TestGuice extends TestCase {
public void testHelloGuice() {
// 無需傳入 Module,Guice 自動解析 @ImplementedBy
Injector injector = Guice.createInjector();
HelloGuice helloGuice = injector.getInstance(HelloGuice.class);
helloGuice.sayHello(); // 輸出: Hello Guice!
}
}
| 類別/介面 | 用途 |
|---|---|
com.google.inject.Module | 綁定定義介面,實作 configure(Binder) |
com.google.inject.Binder | 綁定 API:bind(介面).to(實作).in(Scope) |
com.google.inject.Guice | 入口類別:createInjector(Module...) |
com.google.inject.Injector | 物件圖引擎:getInstance(Type)、injectMembers(obj) |
@ImplementedBy | 介面註解,指定預設實作類別 |
@Inject | 標註建構子/方法/欄位需注入 |
com.google.inject.Scopes | 範圍常數:SINGLETON、PROTOTYPE 等 |
@Inject public MyClass(DepA a, DepB b) { }@Inject public void setDepA(DepA a) { }@Inject private DepA a;@BindingAnnotation + bind().annotatedWith()bind(Type).toProvider(MyProvider.class)Guice 入門極簡單:定義介面、實作、Module 綁定、Injector 取得實例。@ImplementedBy 更讓簡單案例零設定檔。後續可探索 AOP 攔截器、Servlet 整合、Struts 2/Spring 整合等進階主題。