Spring 模組高度獨立,可按需使用。IoC(Inversion of Control,控制反轉),又稱 DI(Dependency Injection,依賴注入),核心在於:對象間關係由容器管理,而非代碼硬編碼控制。開發者只需宣告依賴,運行時由容器根據 XML 注入。
public interface Human { void eat(); void walk(); }
public class Chinese implements Human { ... }
public class American implements Human { ... }
public class Factory {
public static final String CHINESE = "Chinese";
public static final String AMERICAN = "American";
public Human getHuman(String ethnic) {
if (ethnic.equals(CHINESE)) return new Chinese();
else if (ethnic.equals(AMERICAN)) return new American();
else throw new IllegalArgumentException("參數錯誤");
}
}
客戶端調用:
Human human = new Factory().getHuman(Factory.CHINESE); human.eat(); human.walk();
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="Chinese" class="cn.com.chengang.spring.Chinese"/>
<bean id="American" class="cn.com.chengang.spring.American"/>
</beans>
ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");
Human human = (Human) ctx.getBean("Chinese");
human.eat(); human.walk();
ctx 相當於原本的 Factory,且利用 Java 反射動態生成對象。
| 維度 | 工廠模式 | Spring IoC |
|---|---|---|
| 需求變更修改處 | 修改 Factory 代碼,重新編譯部署 | 修改 bean.xml class 屬性,支援熱插拔(無需重啟) |
| 對象生成機制 | new 實例化 | 反射動態生成 |
| 適用場景 | 固定、單一創建邏輯 | 需彈性切換實作、支援熱部署 |
<bean id="Chinese" class="..." singleton="true">
<property name="humanName"><value>陳剛</value></property>
</bean>
自動注入屬性,singleton=true 確保單例模式。
領域類別(Human、Chinese、American)零依賴 Spring API,無需繼承特定介面/類別。僅 ClientTest 引用 Spring 類別。這是衡量框架優劣的關鍵指標之一。
IoC 靈活性有代價:配置步驟較繁、生成方式不直觀、反射效率稍低。判斷原則:原本使用工廠模式的地方,皆可考慮改用 IoC。