Bean 是 Spring 容器管理的核心對象。本文系統整理 Bean 生命週期、依賴配置三種模式、五種自動裝配策略、依賴檢查機制、集合注入語法,以及三種容器獲取 Bean 的方式,構建完整的 Spring Bean 知識體系。
| 階段 | 配置方式 | 說明 |
|---|---|---|
| 初始化 | init-method="init" |
XML 指定初始化方法名 |
實現 InitializingBean |
重寫 afterPropertiesSet(),耦合 Spring API |
|
| 使用(三種獲取方式) | BeanWrapper |
底層屬性操作工具,直接操作對象屬性 |
BeanFactory |
基礎容器,XmlBeanFactory 已棄用,歷史遺留 |
|
ApplicationContext |
高級容器,企業級開發標準,支援國際化、事件、資源加載 | |
| 銷毀 | destroy-method="cleanup" |
XML 指定銷毀方法 |
實現 DisposableBean |
重寫 destroy(),耦合 Spring API |
最佳實踐:優先使用 @PostConstruct/@PreDestroy(JSR-250)或 init-method/destroy-method,避免實現 Spring 接口造成耦合。
<property name="target">
<ref local="beanId"/> <!-- 同一 XML 文件,編譯期校驗 ID 存在性 -->
<ref bean="beanId"/> <!-- 跨文件引用,運行期校驗 -->
<ref parent="beanId"/> <!-- 父容器 Bean,層級容器場景 -->
</property>
| 模式 | 匹配規則 | 適用場景 |
|---|---|---|
| byName | 屬性名 = Bean ID | 命名規範專案 |
| byType | 屬性類型 = Bean 類型(唯一) | 單一實現類 |
| constructor | 構造器參數類型匹配 | 不可變對象、強依賴 |
| autodetect | 有構造器用 constructor,否則 byType | 兼容舊版本 |
| no (默認) | 手動配置 <property>/<constructor-arg> | 精確控制、生產環境推薦 |
注意:自動裝配無法處理簡單類型、集合、多候選 Bean 歧義;生產環境建議顯式配置。
配合 autowire 使用,容器啟動時驗證依賴滿足情況:
| 模式 | 檢查範圍 |
|---|---|
| simple | 基本類型、String 等非引用類型 |
| object | 引用類型依賴 |
| all | simple + object |
| none (默認) | 不檢查 |
<!-- List -->
<property name="listProp">
<list>
<value>item1</value>
<value>item2</value>
<ref bean="someBean"/>
</list>
</property>
<!-- Set -->
<property name="setProp">
<set>
<value>item1</value>
<ref bean="otherBean"/>
</set>
</property>
<!-- Map -->
<property name="mapProp">
<map>
<entry key="key1" value="value1"/>
<entry key="key2" value-ref="someBean"/>
</map>
</property>
<!-- Properties -->
<property name="propsProp">
<props>
<prop key="key1">value1</prop>
<prop key="key2">value2</prop>
</props>
</property>
關鍵點:value-ref 引用 Bean,value 字面值;entry 支援 key-ref 引用 Bean 作為鍵。
| 容器類型 | 特點 | 典型用法 |
|---|---|---|
| BeanWrapper | 非容器,屬性訪問器 | 框架內部、數據綁定 |
| BeanFactory | 延遲加載,基礎 DI | 資源受限環境、測試 |
| ApplicationContext | 啟動即加載單例,企業級功能全 | Web 應用、生產環境標準 |
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"https://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="exampleBean" class="com.example.ExampleBean"
init-method="init" destroy-method="cleanup"
autowire="byName" dependency-check="objects">
<!-- 簡單屬性 -->
<property name="name" value="example"/>
<property name="count" value="10"/>
<!-- 引用依賴 -->
<property name="service" ref="myService"/>
<!-- 集合注入 -->
<property name="tags">
<list>
<value>tag1</value>
<value>tag2</value>
</list>
</property>
</bean>
</beans>
<property>)+ 構造器注入(<constructor-arg>)ApplicationContext 是企業級開發標準容器