spring的自動裝配功能的定義:無須在Spring配置文件中描述javaBean之間的依賴關系(如配置<property>、<constructor-arg>)。IOC容器會自動建立javabean之間的關聯關系。
如果沒有采用自動裝配的話,手動裝配我們通常在配置文件中進行實現:一下代碼就是手動裝配:
1
2
3
4
5
6
7
8
9
10
|
< beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> < bean id = "customerDAO" class = "com.hebeu.customer.dao.JdbcCustomerDAO" > < property name = "dataSource" ref = "dataSource" /> </ bean > </ beans > |
通過<property name="dataSource" ref="dataSource" />向customerDAO的bean中注入了dataSource
在Spring框架,可以用 auto-wiring 功能會自動裝配Bean。要啟用它,只需要在 <bean>定義“autowire”屬性。
1
|
< bean id = "customer" class = "com.yiibai.common.Customer" autowire = "byName" /> |
在Spring中,支持 5 自動裝配模式。
- no – 缺省情況下,自動配置是通過“ref”屬性手動設定
- byName – 根據屬性名稱自動裝配。如果一個bean的名稱和其他bean屬性的名稱是一樣的,將會自裝配它。
- byType – 按數據類型自動裝配。如果一個bean的數據類型是用其它bean屬性的數據類型,兼容并自動裝配它。
- constructor – 在構造函數參數的byType方式。
- autodetect – 如果找到默認的構造函數,使用“自動裝配用構造”; 否則,使用“按類型自動裝配”?!驹赟pring3.0以后的版本被廢棄,已經不再合法了】
第一種自動裝配【根據屬性名稱自動裝配】
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package com.hebeu.model; public class Customer { private Address address; public Customer() { } public Customer( int id, Address address) { super (); this .address = address; } public Address getAddress() { return address; } public void setAddress(Address address) { this .address = address; } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package com.hebeu.model; public class Address { private String fulladdress; public Address(){ } public Address(String addr){ this .fulladdress = addr; } public String getFulladdress() { return fulladdress; } public void setFulladdress(String fulladdress) { this .fulladdress = fulladdress; } } |
1
2
3
4
5
6
7
8
9
10
11
12
|
< beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> < bean id = "customer" class = "com.hebeu.model.Customer" autowire = "byName" ></ bean > < bean id = "address" class = "com.hebeu.model.Address" > < property name = "fulladdress" value = "YiLong Road, CA 188" ></ property > </ bean > </ beans > |
這樣就將address注入到Customer中。這就是自動注入ByName.在Customer bean中公開了一個屬性address,Spring容器會找到address bean,并且裝配。這里必須要注意,Customer中要被注入的bean的set方法要求必須是public的,否則會報空指針異常。還有配置的bean的id必須和Customer中聲明的變量名相同。
第二種自動裝配【根據數據類型自動裝配】
聲明的倆個bean同樣為Customer以及Address,將applicationContext.xml轉換為這樣的就是實現根據數據類型進行自動裝配。
1
2
3
4
5
6
7
8
9
10
11
|
< beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> < bean id = "customer" class = "com.hebeu.model.Customer" <strong>< span style = "color:#FF0000;" >autowire="byType"</ span ></ strong >></ bean > < bean id = "bean1" class = "com.hebeu.model.Address" > < property name = "fulladdress" value = "YiLong Road, CA 188" ></ property > </ bean > </ beans > |
類型自動裝配的意思是如果一個bean的數據類型與其他的bean屬性的數據類型相同,將會自動兼容裝配它。當然要求只能配置一個某一個類型的bean.如果配置成這樣,那么是會出錯的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
< beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> < bean id = "customer" class = "com.hebeu.model.Customer" autowire = "byType" ></ bean > < bean id = "bean1" class = "com.hebeu.model.Address" > < property name = "fulladdress" value = "YiLong Road, CA 188" ></ property > </ bean > < bean id = "bean2" class = "com.hebeu.model.Address" > < property name = "fulladdress" value = "YiLong Road, CA 188" ></ property > </ bean > </ beans > |
第三種自動裝配【根據構造方法自動裝配】
案例同上,將applicationContext.xml轉換為如下,就實現了按照構造方法自動裝配:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
< beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> < bean id = "customer" class = "com.hebeu.model.Customer" > <!-- 構造方法的參數 --> < constructor-arg > < ref bean = "bean1" /> </ constructor-arg > </ bean > < bean id = "bean1" class = "com.hebeu.model.Address" > < property name = "fulladdress" value = "YiLong Road, CA 188" ></ property > </ bean > </ beans > |
它實際上是構造函數的參數類型自動裝配。這意味著如果一個bean的數據類型與其他bean的構造器參數的數據類型是相同的,那么就自動裝配。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://blog.csdn.net/qq_28663043/article/details/56495501?locationNum=2&fps=1