Spring 3.2.2 支持:no(默認)、byName、byType、constructor。
<bean id="foo" class="...Foo" autowire="autowire type"/>
public class CumputerBean { private String name; public void setName(String name) {...} }
public class DeptBean { private String name; public void setName(String name) {...} }
public class EmployeeBean {
private DeptBean deptBean;
private CumputerBean cumputerBean;
// setter 注入版
public void setDeptBean(DeptBean deptBean) {...}
public void setCumputerBean(CumputerBean cumputerBean) {...}
// 構造器注入版
public EmployeeBean(DeptBean deptBean, CumputerBean cumputerBean) {...}
}
<bean id="employeeBean" class="...EmployeeBean">
<property name="cumputerBean" ref="cumputerBean"/>
<property name="deptBean" ref="deptBean"/>
</bean>
優點:明確可控,文檖系統結構。大型項目推薦。
<bean id="employeeBean" class="...EmployeeBean" autowire="byName"/>
<!-- 需存在 id="deptBean" 和 id="cumputerBean" 的 Bean -->
規則:EmployeeBean 有 setDeptBean → 尋找 id="deptBean" 的 Bean 注入。
<bean id="employeeBean" class="...EmployeeBean" autowire="byType"/>
規則:容器中恰好有一個該類型 Bean 才注入。
⚠️ 陷阱:若有多個同類型 Bean → 拋 NoUniqueBeanDefinitionException。
⚠️ 無匹配 → 不報錯,屬性為 null。
<bean id="employeeBean" class="...EmployeeBean" autowire="constructor"/>
<!-- EmployeeBean(DeptBean, CumputerBean) -->
配置只提供 CumputerBean,缺 DeptBean → NoSuchBeanDefinitionException(索引 0 參數未滿足)。
配置 deptBean 和 deptBean1 兩個 DeptBean,但構造器參數名為 deptBean → 不報錯,Spring 按參數名精確匹配。
配置 deptBean1、deptBean2,構造器參數名仍為 deptBean → NoUniqueBeanDefinitionException(同 byType)。
| 場景 | 推薦模式 | 理由 |
|---|---|---|
| 大型項目、團隊協作 | no (手動 ref) | 明確依賴,易重構,文檔化 |
| 小型項目、約定優於配置 | byName | 語義清晰,id 與屬性名對應 |
| 單實例類型、無歧義 | byType / constructor | 減少 XML 體積 |
| 現代 Spring (3.1+) | @Autowired + @Qualifier | 類型+名稱雙重精準,編譯期檢查 |
byType/constructor 最易發生「多 Bean 衝突」理解四大模式機制與邊界,才能在自動化與可控性間找到平衡點。