Spring 強調「配置外部化」(XML/JavaConfig),Guice 推崇「程式碼即配置」(Module 類 + 註解)。這導致兩者在開發體驗、啟動性能、擴展機制上有本質不同。
public interface MyService { void myMethod(); }
public class MyServiceImpl implements MyService {
public void myMethod() { System.out.println("Hello, Guice!"); }
}
public class Client {
private MyService service;
@Inject // 或 @Autowired (JSR-330)
public void setService(MyService service) { this.service = service; }
public void execute() { service.myMethod(); }
}
public class MyModule implements Module {
public void configure(Binder binder) {
binder.bind(MyService.class).to(MyServiceImpl.class).in(Scopes.SINGLETON);
}
}
public class Main {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new MyModule());
Client client = injector.getInstance(Client.class); // 自動注入並返回
client.execute();
}
}
@ImplementedBy(MyServiceImpl.class)
public interface MyService { void myMethod(); }
// Module 中無需 bind,自動解析
public class Client {
@Inject private MyService service; // 字段注入
@Inject public Client(MyService service) {} // 構造器注入
@Inject public void init(MyService service) {} // 方法注入
}
@BindingAnnotation @Target({FIELD, PARAMETER}) @Retention(RUNTIME)
public @interface PayPal {}
public class Client {
@Inject @PayPal private PaymentService service; // 僅注入 PayPal 實現
}
binder.bind(PaymentService.class).annotatedWith(PayPal.class).to(PayPalService.class);
| 維度 | Spring | Guice |
|---|---|---|
| 配置方式 | XML / JavaConfig / 註解 | 純 Java Module + 註解 |
| 啟動速度 | 較慢(掃描/解析 XML) | 極快(編譯時類型安全) |
| 學習曲線 | 平緩,生態豐富 | 陡峭,概念精簡 |
| AOP 支援 | 完整(AspectJ 整合) | 基礎(MethodInterceptor) |
| 事務管理 | @Transactional 開箱即用 | 需手動整合或第三方 |
| 企業級功能 | 全棧(MVC, Batch, Security, Cloud) | 專注 DI,需自行組裝 |
| 適用場景 | 大型企業應用、微服務、全棧開發 | 輕量級應用、Android、庫開發、性能敏感場景 |
無最好,只有最適合。Guice 以極簡核心換取極致性能與類型安全,Spring 以豐富生態換取開發效率與企業級支撐。