配置範例速覽
<bean id="TheAction"
class="net.xiaxin.spring.qs.UpperAction"
singleton="true"
init-method="init"
destroy-method="cleanup"
depends-on="ActionManager">
<property name="message"><value>HeLLo</value></property>
<property name="desc"><null/></property>
<property name="dataSource"><ref local="dataSource"/></property>
</bean>
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"><value>java:comp/env/jdbc/sample</value></property>
</bean>
核心屬性深度解析
| 屬性 | 作用 | 關鍵點 |
id | BeanFactory 中唯一標識 | getBean("id") 索引鍵 |
class | 實現類全限定名 | 必須可實例化 |
singleton | true 單例(默認),false 原型 | 單例:容器級緩存唯一實例;原型:每次獲取新建 |
init-method | 初始化回調方法 | 實例化、屬性注入後調用,用於資源初始化 |
destroy-method | 銷毀回調方法 | 容器關閉時調用,用於資源釋放(單例有效) |
depends-on | 強制依賴其他 Bean 先初始化 | 罕用,解決靜態變量初始化順序等 Bad Smell 場景 |
屬性注入細節
<value>:字面值,容器自動類型轉換(String → 基本類型、Date 等)
<null/>:顯式注入 null,區別於空字符串 <value></value>
<ref local/bean/parent>:引用容器內其他 Bean,local 利用 XML IDREF 校驗存在性
容器啟動與獲取 Bean
InputStream is = new FileInputStream("beans.xml");
XmlBeanFactory factory = new XmlBeanFactory(is); // 舊版 API,現推薦 ApplicationContext
Action action = (Action) factory.getBean("TheAction");
// 此時 action 已完成:實例化 → 屬性注入 → init-method
現代最佳實踐提示
- 生產環境請使用
ApplicationContext(ClassPathXmlApplicationContext 等),功能更豐富(國際化、事件發布、資源加載、生命週期管理)。
- Spring 3.0+ 推薦
@Component + @Autowired 註解配置,XML 僅用於基礎設施整合。
depends-on 能避免則避免,重構靜態依賴為更佳設計。