Guice (發音 "juice") 是 Google 開發的輕量級依賴注入框架,以「無 XML、極速啟動、類型安全」著稱。本文系統講解 Guice 核心概念、綁定模式、AOP 整合、模組化最佳實踐與遷移 Spring 經驗。
| 維度 | Guice | Spring |
|---|---|---|
| 啟動速度 | 極快 (無 XML 解析、類掃描優化) | 較慢 (掃描、解析、代理建立) |
| 配置方式 | 純 Java 程式碄 (Module) | XML + 註解 + Java Config |
| 類型安全 | 編譯期檢查、重構友好 | 運行期解析、字串風險 |
| 生態系統 | 精簡、專注 DI/AOP | 龐大、全棧 (Web、Data、Security、Batch...) |
| 適用場景 | 微服務、CLI 工具、嵌入式、Android、測試 | 企業級單體/微服務、複雜業務系統 |
<dependency> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <version>5.1.0</version> </dependency> <!-- JSR-330 標準註解 --> <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> <!-- AOP 支援 --> <dependency> <groupId>com.google.inject.extensions</groupId> <artifactId>guice-assistedinject</artifactId> <version>5.1.0</version> </dependency>
public interface UserService {
User findById(Long id);
User create(UserDTO dto);
}
public class UserServiceImpl implements UserService {
private final UserRepository repository;
private final EmailService emailService;
@Inject // 建構子注入 (推薦:不可變、最終、易測試)
public UserServiceImpl(UserRepository repository, EmailService emailService) {
this.repository = repository;
this.emailService = emailService;
}
// ...
}
public class ServiceModule extends AbstractModule {
@Override
protected void configure() {
// 1. 基礎綁定:介面 → 實現
bind(UserService.class).to(UserServiceImpl.class).in(Scopes.SINGLETON);
// 2. 實例綁定:配置物件、第三方客戶端
bind(OkHttpClient.class).toInstance(buildHttpClient());
// 3. 提供者綁定:複雜構建邏輯
bind(DataSource.class).toProvider(DataSourceProvider.class).in(Scopes.SINGLETON);
// 4. 註解區分多實現
bind(PaymentService.class).annotatedWith(Names.named("alipay")).to(AlipayService.class);
bind(PaymentService.class).annotatedWith(Names.named("wechat")).to(WechatPayService.class);
// 5. 類型字面量綁定泛型
bind(new TypeLiteral>() {}).toInstance(Collections.emptyList());
// 6. Just-in-time 綁定 (隱式):有 @Inject 建構子的類無需顯式 bind
}
private OkHttpClient buildHttpClient() {
return new OkHttpClient.Builder()
.connectionPool(new ConnectionPool(50, 5, TimeUnit.MINUTES))
.build();
}
}
public class DataSourceProvider implements Provider{ @Inject private EnvironmentConfig config; // 注入配置物件 @Override public DataSource get() { HikariDataSource ds = new HikariDataSource(); ds.setJdbcUrl(config.getDbUrl()); ds.setUsername(config.getDbUser()); ds.setPassword(config.getDbPass()); ds.setMaximumPoolSize(config.getDbPoolSize()); return ds; } }
// 1. 定義攔截器
public class TransactionInterceptor implements MethodInterceptor {
@Inject private TransactionManager txManager;
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Transaction tx = txManager.begin();
try {
Object result = invocation.proceed();
txManager.commit(tx);
return result;
} catch (Exception e) {
txManager.rollback(tx);
throw e;
}
}
}
// 2. 綁定攔截器 (匹配註解)
public class AopModule extends AbstractModule {
@Override
protected void configure() {
bindInterceptor(
Matchers.annotatedWith(Transactional.class), // 類或方法標註
Matchers.any(),
new TransactionInterceptor()
);
}
}
// 3. 使用
@Transactional
public void transfer(Long from, Long to, BigDecimal amount) { ... }
// 參數化建構子:部分依賴由容器注入,部分由工廠參數提供
public class PaymentProcessor {
private final PaymentGateway gateway; // 容器注入
private final String orderId; // 工廠參數
private final BigDecimal amount; // 工廠參數
@AssistedInject
public PaymentProcessor(PaymentGateway gateway,
@Assisted("orderId") String orderId,
@Assisted("amount") BigDecimal amount) {
this.gateway = gateway;
this.orderId = orderId;
this.amount = amount;
}
}
// 工廠介面 (Guice 自動生成實現)
public interface PaymentProcessorFactory {
PaymentProcessor create(@Assisted("orderId") String orderId, @Assisted("amount") BigDecimal amount);
}
// Module 綁定
install(new FactoryModuleBuilder()
.implement(PaymentProcessor.class, PaymentProcessor.class)
.build(PaymentProcessorFactory.class));
public class PaymentPrivateModule extends PrivateModule {
@Override
protected void configure() {
// 內部綁定:外部不可見
bind(PaymentGateway.class).to(InternalGatewayImpl.class);
bind(PaymentService.class).to(PaymentServiceImpl.class);
// 導出介面:外部可注入
expose(PaymentService.class);
expose(PaymentGateway.class); // 可選
}
}
| Spring | Guice | 備註 |
|---|---|---|
| @Component/@Service/@Repository | @Inject 建構子 + Module.bind() | Guice 無掃描,顯式綁定 |
| @Autowired (欄位/Setter) | @Inject (建構子/欄位/方法) | 推薦建構子注入 |
| @Qualifier("name") | @Named("name") / 自定義註解 + BindingAnnotation | |
| @Value("${prop}") | Provider 讀取 Config 物件 | Guice 無內建配置綁定 |
| @PostConstruct/@PreDestroy | 無直接對應,用 LifeCycle 接口或 AOP | |
| @Transactional | 自定義 @Transactional + MethodInterceptor | 需自行實現事務管理 |
| @Async/@Scheduled | 無內建,整合 ExecutorService/Quartz | |
| Spring MVC | 無 Web 框架,整合 Jersey/Spark/Ratpack |
Guice 以「程式碼即配置、類型安全、極速啟動」重新定義了輕量級 DI。雖生態不及 Spring 豐富,但在微服務、CLI、測試、Android、嵌入式等場景極具優勢。掌握 Module 綁定、Provider、AOP、AssistedInject、Private Module 核心機制,即可駕輕就熟構建高內聚、低耦合、易測試的 Java 應用。