一、字面值
字面值:可用字符串表示的值,可以通過 <value> 元素標(biāo)簽或 value 屬性進(jìn)行注入。
基本數(shù)據(jù)類型及其封裝類、String 等類型都可以采取字面值注入的方式
若字面值中包含特殊字符,可以使用 <![CDATA[]]> 把字面值包裹起來。


二、引用其它 Bean
組成應(yīng)用程序的 Bean 經(jīng)常需要相互協(xié)作以完成應(yīng)用程序的功能. 要使 Bean 能夠相互訪問, 就必須在 Bean 配置文件中指定對 Bean 的引用
在 Bean 的配置文件中, 可以通過 <ref> 元素或 ref 屬性為 Bean 的屬性或構(gòu)造器參數(shù)指定對 Bean 的引用.
也可以在屬性或構(gòu)造器里包含 Bean 的聲明, 這樣的 Bean 稱為內(nèi)部 Bean
(1)通過ref屬性引用Bean


(2)內(nèi)部Bean
當(dāng) Bean 實例僅僅給一個特定的屬性使用時, 可以將其聲明為內(nèi)部 Bean. 內(nèi)部 Bean 聲明直接包含在或 元素里, 不需要設(shè)置任何 id 或 name 屬性
內(nèi)部 Bean 不能使用在任何其他地方


三、注入?yún)?shù)詳解:null 值和級聯(lián)屬性
可以使用專用的 <null/> 元素標(biāo)簽為 Bean 的字符串或其它對象類型的屬性注入 null 值
Spring 支持級聯(lián)屬性的配置。
(1)<null/>


(2)級聯(lián)屬性的配置

四、集合屬性
在 Spring中可以通過一組內(nèi)置的 xml 標(biāo)簽(例如:<list>,<set>或<map>) 來配置集合屬性.
配置 java.util.List 類型的屬性, 需要指定<list>標(biāo)簽, 在標(biāo)簽里包含一些元素. 這些標(biāo)簽可以通過<value>指定簡單的常量值, 通過<ref>指定對其他 Bean 的引用. 通過<bean>指定內(nèi)置 Bean 定義. 通過<null/>指定空元素. 甚至可以內(nèi)嵌其他集合.
數(shù)組的定義和 List 一樣, 都使用<list>
配置 java.util.Set 需要使用 <set> 標(biāo)簽, 定義元素的方法與 List 一樣.
Java.util.Map 通過<map>標(biāo)簽定義,<map>標(biāo)簽里可以使用多個<entry>作為子標(biāo)簽. 每個條目包含一個鍵和一個值.?
必須在<key>標(biāo)簽里定義鍵
因為鍵和值的類型沒有限制, 所以可以自由地為它們指定<value>,<ref>,<bean>或<null>元素.?
可以將 Map 的鍵和值作為<entry>的屬性定義: 簡單常量使用 key 和 value 來定義; Bean 引用通過 key-ref 和 value-ref 屬性定義
使用<props>定義 java.util.Properties, 該標(biāo)簽使用多個<prop>作為子標(biāo)簽. 每個 <prop> 標(biāo)簽必須定義 key 屬性.
(1)list



(2)map



(3)Properties



五、使用 utility scheme 定義集合
使用基本的集合標(biāo)簽定義集合時, 不能將集合作為獨立的 Bean 定義, 導(dǎo)致其他 Bean 無法引用該集合, 所以無法在不同 Bean 之間共享集合.
可以使用 util schema 里的集合標(biāo)簽定義獨立的集合 Bean. 需要注意的是, 必須在 <beans> 根元素里添加 util schema 定義



六、使用 p 命名空間
為了簡化 XML 文件的配置,越來越多的 XML 文件采用屬性而非子元素配置信息。Spring 從 2.5 版本開始引入了一個新的 p 命名空間,可以通過 <bean> 元素屬性的方式配置 Bean 的屬性。
使用 p 命名空間后,基于 XML 的配置方式將進(jìn)一步簡化



七、XML 配置里的 Bean 自動裝配
Spring IOC 容器可以自動裝配 Bean. 需要做的僅僅是在 的 autowire 屬性里指定自動裝配的模式
byType(根據(jù)類型自動裝配): 若 IOC 容器中有多個與目標(biāo) Bean 類型一致的 Bean. 在這種情況下, Spring 將無法判定哪個 Bean 最合適該屬性, 所以不能執(zhí)行自動裝配.
byName(根據(jù)名稱自動裝配): 必須將目標(biāo) Bean 的名稱和屬性名設(shè)置的完全相同.
constructor(通過構(gòu)造器自動裝配): 當(dāng) Bean 中存在多個構(gòu)造器時, 此種自動裝配方式將會很復(fù)雜. 不推薦使用
(1)在沒有使用自動裝配





(2)使用自動裝配

得到的輸出一樣
byName根據(jù)bean的名字和當(dāng)前bean的setter風(fēng)格的屬性名自動裝配,若有匹配的則進(jìn)行自動裝配,若沒有匹配的,則不裝配。


byType根據(jù)bean的類型和當(dāng)前Bean的屬性的類型進(jìn)行自動裝配


若IOC容器中有1個以上的類型匹配的bean,則拋異常


八、XML 配置里的 Bean 自動裝配的缺點
在 Bean 配置文件里設(shè)置 autowire 屬性進(jìn)行自動裝配將會裝配 Bean 的所有屬性. 然而, 若只希望裝配個別屬性時, autowire 屬性就不夠靈活了.
autowire 屬性要么根據(jù)類型自動裝配, 要么根據(jù)名稱自動裝配, 不能兩者兼而有之.
一般情況下,在實際的項目中很少使用自動裝配功能,因為和自動裝配功能所帶來的好處比起來,明確清晰的配置文檔更有說服力一些
九、繼承 Bean 配置
Spring 允許繼承 bean 的配置, 被繼承的 bean 稱為父 bean. 繼承這個父 Bean 的 Bean 稱為子 Bean
子 Bean 從父 Bean 中繼承配置, 包括 Bean 的屬性配置
子 Bean 也可以覆蓋從父 Bean 繼承過來的配置
父 Bean 可以作為配置模板, 也可以作為 Bean 實例. 若只想把父 Bean 作為模板, 可以設(shè)置<bean>的abstract 屬性為 true, 這樣 Spring 將不會實例化這個 Bean
并不是 <bean>元素里的所有屬性都會被繼承. 比如: autowire, abstract 等.
也可以忽略父 Bean 的 class 屬性, 讓子 Bean 指定自己的類, 而共享相同的屬性配置. 但此時 abstract 必須設(shè)為 true


第一個bean設(shè)置的abstract 屬性為 true,這樣的bean不能被IOC容器實例化,只用來被繼承配置


忽略父 Bean 的 class 屬性, 讓子 Bean 指定自己的類



十、依賴 Bean 配置
Spring 允許用戶通過 depends-on 屬性設(shè)定 Bean 前置依賴的Bean,前置依賴的 Bean 會在本 Bean 實例化之前創(chuàng)建好
如果前置依賴于多個 Bean,則可以通過逗號,空格或的方式配置 Bean 的名稱

十一、Bean 的作用域
在 Spring 中, 可以在 <bean> 元素的 scope 屬性里設(shè)置 Bean 的作用域.
默認(rèn)情況下, Spring 只為每個在 IOC 容器里聲明的 Bean 創(chuàng)建唯一一個實例, 整個 IOC 容器范圍內(nèi)都能共享該實例:所有后續(xù)的 getBean() 調(diào)用和 Bean 引用都將返回這個唯一的 Bean 實例.該作用域被稱為 singleton, 它是所有 Bean 的默認(rèn)作用域.

(1)singleton


(2)prototype



十二、使用外部屬性文件
在配置文件里配置 Bean 時, 有時需要在 Bean 的配置里混入系統(tǒng)部署的細(xì)節(jié)信息(例如: 文件路徑, 數(shù)據(jù)源配置信息等). 而這些部署細(xì)節(jié)實際上需要和 Bean 配置相分離
Spring 提供了一個 PropertyPlaceholderConfigurer 的 BeanFactory 后置處理器, 這個處理器允許用戶將 Bean 配置的部分內(nèi)容外移到屬性文件中. 可以在 Bean 配置文件里使用形式為 ${var} 的變量, PropertyPlaceholderConfigurer 從屬性文件里加載屬性, 并使用這些屬性來替換變量.
Spring 還允許在屬性文件中使用 ${propName},以實現(xiàn)屬性之間的相互引用。
方式一:
(1)導(dǎo)入c3p0和MySQL驅(qū)動包

(2)設(shè)置用戶名,密碼,驅(qū)動類,和數(shù)據(jù)庫的地址

(3)獲取數(shù)據(jù)庫的連接

方式二:
(4)db.properties

(5)導(dǎo)入屬性文件,使用外部屬性文件的屬性

(6)數(shù)據(jù)庫連接正常。
十三、Spring表達(dá)式語言:SpEL
Spring 表達(dá)式語言(簡稱SpEL):是一個支持運行時查詢和操作對象圖的強大的表達(dá)式語言。
語法類似于 EL:SpEL 使用 #{…} 作為定界符,所有在大框號中的字符都將被認(rèn)為是 SpEL
SpEL 為 bean 的屬性進(jìn)行動態(tài)賦值提供了便利
通過 SpEL 可以實現(xiàn):
①、通過 bean 的 id 對 bean 進(jìn)行引用
②、調(diào)用方法以及引用對象中的屬性
③、計算表達(dá)式的值
④、正則表達(dá)式的匹配


十四、IOC 容器中 Bean 的生命周期方法
Spring IOC 容器可以管理 Bean 的生命周期, Spring 允許在 Bean 生命周期的特定點執(zhí)行定制的任務(wù).
Spring IOC 容器對 Bean 的生命周期進(jìn)行管理的過程:
①、通過構(gòu)造器或工廠方法創(chuàng)建 Bean 實例
②、為 Bean 的屬性設(shè)置值和對其他 Bean 的引用
③、調(diào)用 Bean 的初始化方法
④、Bean 可以使用了
⑤、當(dāng)容器關(guān)閉時, 調(diào)用 Bean 的銷毀方法
在 Bean 的聲明里設(shè)置 init-method 和 destroy-method 屬性, 為 Bean 指定初始化和銷毀方法.



十五、創(chuàng)建 Bean 后置處理器
Bean 后置處理器允許在調(diào)用初始化方法前后對 Bean 進(jìn)行額外的處理.
Bean 后置處理器對 IOC 容器里的所有 Bean 實例逐一處理, 而非單一實例. 其典型應(yīng)用是: 檢查 Bean 屬性的正確性或根據(jù)特定的標(biāo)準(zhǔn)更改 Bean 的屬性.
對Bean 后置處理器而言, 需要實現(xiàn)?BeanPostProcessor接口. 在初始化方法被調(diào)用前后, Spring 將把每個 Bean 實例分別傳遞給上述接口的以下兩個方法:
postProcessBeforeInitialization
postProcessAfterInitialization
添加 Bean 后置處理器后 Bean 的生命周期
Spring IOC 容器對 Bean 的生命周期進(jìn)行管理的過程:
1、通過構(gòu)造器或工廠方法創(chuàng)建 Bean 實例
2、為 Bean 的屬性設(shè)置值和對其他 Bean 的引用
3、將 Bean 實例傳遞給 Bean 后置處理器的 postProcessBeforeInitialization 方法
4、調(diào)用 Bean 的初始化方法
5、將 Bean 實例傳遞給 Bean 后置處理器的 postProcessAfterInitialization方法
6、Bean 可以使用了
7、當(dāng)容器關(guān)閉時, 調(diào)用 Bean 的銷毀方法



十六、通過調(diào)用靜態(tài)工廠方法創(chuàng)建 Bean
調(diào)用靜態(tài)工廠方法創(chuàng)建 Bean是將對象創(chuàng)建的過程封裝到靜態(tài)方法中. 當(dāng)客戶端需要對象時, 只需要簡單地調(diào)用靜態(tài)方法, 而不同關(guān)心創(chuàng)建對象的細(xì)節(jié).
要聲明通過靜態(tài)方法創(chuàng)建的 Bean, 需要在 Bean 的 class 屬性里指定擁有該工廠的方法的類, 同時在 factory-method 屬性里指定工廠方法的名稱. 最后, 使用 <constrctor-arg> 元素為該方法傳遞方法參數(shù).
(1)Car.java

(2)創(chuàng)建靜態(tài)工廠方法

(3)通過靜態(tài)方法來配置Bean
class屬性:指向靜態(tài)工廠方法的全類名
factory-method:指向靜態(tài)工廠方法的名字
constructor-arg:如果工廠方法需要傳入?yún)?shù),則使用constructor-arg來配置參數(shù)

(4)測試一下

十七、通過調(diào)用實例工廠方法創(chuàng)建 Bean
實例工廠方法: 將對象的創(chuàng)建過程封裝到另外一個對象實例的方法里. 當(dāng)客戶端需要請求對象時, 只需要簡單的調(diào)用該實例方法而不需要關(guān)心對象的創(chuàng)建細(xì)節(jié).
要聲明通過實例工廠方法創(chuàng)建的 Bean
①、在 bean 的 factory-bean 屬性里指定擁有該工廠方法的 Bean
②、在 factory-method 屬性里指定該工廠方法的名稱
③、使用 construtor-arg 元素為工廠方法傳遞方法參數(shù)



十八、實現(xiàn) FactoryBean 接口在 Spring IOC 容器中配置 Bean
Spring 中有兩種類型的 Bean, 一種是普通Bean, 另一種是工廠Bean, 即FactoryBean.
工廠 Bean 跟普通Bean不同, 其返回的對象不是指定類的一個實例, 其返回的是該工廠 Bean 的 getObject 方法所返回的對象


