承上篇 Spring IOC 概述,本文結合實戰經驗講解 Bean 在配置文件中的基礎配置技巧,旨在使結構更合理、編寫量更少。內容適合能讀懂基本 Bean 配置的開發者,歡迎討論指正。
<bean id="bean_test" class="cn.qtone.test.HelloWorld"/>
等同於 HelloWorld tmp = new HelloWorld();,但 Spring 容器中為單例(預設 scope="singleton"),非傳統單態模式。需原型模式每次新建實例:
<bean id="bean_test" class="cn.qtone.test.HelloWorld" scope="prototype"/>
Web 環境還支援 request、session 作用域。多線程環境下單例是否安全需謹慎評估。
無無參構造器時需聲明構造參數:
<bean id="bean_test" class="cn.qtone.test.HelloWorld" scope="prototype">
<constructor-arg><value>hello</value></constructor-arg> <!-- 單參構造 -->
</bean>
多參構造器建議用 index 明確位置,避免歧義:
<bean id="bean_date" class="java.util.Date"/>
<bean id="bean_test" class="cn.qtone.test.HelloWorld" scope="prototype">
<constructor-arg index="0" ref="bean_date"/>
<constructor-arg index="1"><value>345</value></constructor-arg>
</bean>
Spring 會自動類型轉換(如字符串轉 int)。不建議使用自動依賴查找(autowire),會降低配置可讀性。
<bean id="bean_string" class="cn.qtone.test.TestFactory" factory-method="getBean"/>
對應 public static Object getBean() { return "hello world"; }。工廠類不被實例化。可配合 constructor-arg 傳參。
需兩個 Bean 定義:工廠 Bean 與目標 Bean。
<bean id="bean_factory" class="cn.qtone.test.TestBeanFactory"/>
<bean id="bean_helloWorld" factory-bean="bean_factory" factory-method="getHello"/>
Spring 先實例化 TestBeanFactory,再調用實例方法 getHello() 獲取 Bean。對應 public HelloWorld getHello() { return new HelloWorld(); }。
推薦方式,清晰可讀:
<bean id="bean_test" class="cn.qtone.test.HelloWorld">
<property name="hello" value="你好!"/>
<property name="world" value="世界"/>
<property name="date" ref="bean_date"/>
</bean>
對應 JavaBean 規范的 Setter:setHello(String)、setWorld(String)、setDate(Date)。屬性名首字母大小寫不敏感,其餘嚴格區分。Setter 注入優勢:通過名稱直觀知曉注入內容與語義,Spring 官方推薦。
構造器注入適用場景:希望注入對象不可被外部修改(不可變對象)。
本文涵蓋 Bean 實例化(構造器、靜態/實例工廠)與屬性注入基礎配置。下篇將探討 Bean 繼承、抽象等進階配置技巧。