Guice 與 Spring JavaConfig 同樣採用 Java 註解將 IoC 配置從 XML 遷移至代碼,但核心哲學截然不同:
| 維度 | Spring (JavaConfig) | Guice |
|---|---|---|
| 配置位置 | 外部化:專門的 @Configuration 類 | 內部化:領域模型類直接標註 @Inject |
| 耦合度 | 非侵入式:業務代碼零依賴容器 | 侵入式:需依賴 com.google.inject 包 |
| 元數據表達 | Java 代碼顯式連接對象 | 註解聲明注入點,框架自動綁定 |
| 擴展性 | 豐富 Hook、AOP、事務、多環境 | 專注核心 DI,生態較窄 |
Bob Lee 揭秘:Rod Johnson 早一年展示 JavaConfig,六個月後 Lee 展示 Guice。Guice 引入 @Inject 後發現:「為何還需顯式編寫連接代碼?」從而誕生自動綁定機制。
Debasish Ghosh 指出:本質是依賴關係外部化 vs 內部化的哲學之爭。Spring 提供全棧解決方案,Guice 專注 DI 做到極致。Tapestry IoC 同屬內部化陣營。
Spring 現已支持 @Autowired、@Component 等註解驅動模式,實際上融合了兩派優點:默認非侵入,可選侵入式簡化配置。Guice 則影響了 JSR-330 (javax.inject) 標準化進程。