目錄
4、spring 配置bean的四種方式:註解方式、xml方式(直接映射方式、靜態工廠、實例化工廠)。
1、<bean></bean>標籤的屬性
<bean>可以看做是一個對象,容器初始化的時候,默認會將所有的bean實例化(即創建對象),將這些對象放入容器中統一管理。
id | bean的唯一標識,不能包含特殊字符 |
class | bean類的完全路徑 |
name | bean的名字,基本不用,和id功能一樣,可以包含特殊字符 |
destroy-method | beanFactory銷燬的時候執行,因爲bean的生命週期和beanFactory一樣 |
init-method | bean在被實例化之後執行 |
abstract | 聲明bean爲抽象bean,bean就不會被實例化,作用和parent屬性搭配使用 |
autowire |
自動裝配模式,有5種:no、byName、byType、constructor、default。 假設bean aaa依賴了bean bbb。 no:默認是這個,不使用自動裝配、老老實實地用<ref>標籤去指明依賴bbb byName:根據bean的名字,spring在IoC容器中根據bbb的名字查找bean,然後 給aaa注入bbb,前提是aaa中有相關的setter方法。 byType:根據bean的類型,spring在IoC容器中根據bbb的類型查找bean,然後 給aaa注入bbb,如果同一類型的bean有多個,那麼報錯,如果沒有,那麼不執行 注入。 constructor:通過構造函數的參數類型,spring在容器中去查找構造函數參數所需 的類型bean,然後注入aaa,如果沒有找到,報錯,如果同一類型的bean有多個, 報錯。 default:採用父級標籤(<beans>標籤)的default-autowire屬性。 |
autowire-candidate |
是否接受被自動裝配。autowire可以自動裝配所需的依賴,spring就會找到一些bean, 那麼如果這些bean不願意被自動裝配呢?這些bean可以設置自己的屬性autowire- candidate爲false(即不願意,默認爲true)。 |
depends-on |
依賴關係。標明一個bean對其它bean的依賴關係,和<ref>標籤不同,depends-on只是 說明一個依賴關係,並不一定就是引用,聲明這種依賴關係的作用就是讓被依賴的bean 先於此bean實例化,此bean銷燬後,纔會去銷燬被依賴bean。 |
factory-bean | 指定此bean的工廠。讓工廠生產一個bean,並賦值給此bean。下文有詳細介紹。 |
factory-method | 指定factory-bean工廠中的生產方法。具體的生產是這個方法實現的。下文有詳細介紹。 |
lazy-init |
是否延遲實例化。讓此bean不在容器初始化的時候就實例化,而是當我們需要它(調用它)的 時候,纔去實例化。默認是false,在容器初始化的時候就實例化,true代表用的時候才。。 |
parent |
指定父bean,這裏沒有任何繼承關係,和java裏的父子關係不一樣。當多個bean的成員 屬性都有共同一樣的,那我們不必重複地去定義,我們只需要定義一個父bean,父bean 包含了共同的成員屬性,然後這些子bean聲明parent指定父bean,這些子即可擁有父 bean的全部成員屬性。 |
primary |
是否注入優先。默認false。當容器中有多個類型相同的bean時,使用@Autowired注入這個類型的 bean時,由於有多個,那到底注入哪一個呢?當這些bean都沒有設置primary爲true時,或者 有多個bean設置primary爲true,報錯,因爲不知道要注入哪個(除非只有一個bean)。當只有 一個bean設置primary爲true時,@Autowired注入就會優先選擇這個bean。 |
scope |
一種實例化模式:prototype 和 singleton。prototype模式,容器初始化的時候,此bean不會被實例化 只有當需要用到這個bean的時候,都 new 一個新的實例化對象返回。 singleton模式,其實就是單例 模式,每次需要用這個bean的時候,總是返回同一個實例對象。 |
2、<beans></beans>標籤的屬性
default-autowire |
自動裝配模式,。若子bean沒有設置自己的autowire,那麼就用beans ,如果設置了自己的,那麼就用自己的自動裝配模式。 |
default-autowire-candidates |
是否接受被自動裝配,如果是false,那麼beans標籤下的所有子bean都 不接受被自動裝配。默認是true。 |
default-destroy-method |
指定銷燬方法。正常情況下,如果bean都有自己的銷燬方法,那麼要聲明 多次,如果在beans標籤中聲明瞭此屬性,假如方法爲 hehe(),那麼每個 子bean只需要直接實現各自的hehe()方法即可,即完成銷燬代碼編寫。如果 子bean自己用destroy-method指定了自己的銷燬方法,那麼就是自己的,不 用beans的default-destroy-method。 |
default-init-method | 指定初始化方法。和銷燬方法同理。 |
default-lazy-init |
是否延遲初始化。如果設置爲true(要延遲),那麼所有的子bean都要延遲。 如果此時有子bean自己設置了lazy-init爲false,那麼自己的lazy-init優先生效。 |
default-merge |
這是和bean的parent屬性搭配使用的,父子bean之間的集合元素繼承。爲true, 代表beans下的所有子bean都會有這個特性,凡是聲明瞭parent的,子bean就會 繼承併合並父bean中的集合元素。默認爲false,如果子bean中的list集合標籤中 聲明瞭merger屬性,那麼子bean的merger優先生效。 |
profile |
指定一類bean配置。項目的開發分開發、測試、生產,三個階段的項目配置肯定 略有不同,一般我們手動地去修改配置,完了再部署,可是很不方便,可能沒修 改完或修改正確,那麼此時如果我們事先把三種配置分別用三個文件寫好,然後 每次將profile指定其中一個文件啓動項目,那不就方便多了。profile就是這個功能 |
3、<bean>標籤的子標籤
3.1 meta子標籤
<meta key = "" value = ""></meta>,meta:元數據,以鍵值對形式存在,key是鍵,value是值,在一個bean中聲明meta子元素,這個meta並不是bean的成員,這是在這個bean裏面聲明一下,借用這個bean而已,需要調用meta的時候,是需要借用bean來調用的。
3.2 property子標籤
<property name = "" value = ""></property> 或者 <property name = "" ref = ""></property> ,property:成員屬性,屬性名,屬性值,屬性值可以是一個引用。value代表值,ref代表引用。property是通過setter方法來設置值的。
3.3 constructor-arg 子標籤
property標籤通過setter方法來初始化bean的成員,constructor-arg通過構造函數來初始化bean。
<constructor-arg name = "" value = ""></constructor-arg>表示構造函數的參數名和參數值。value是值,ref是引用。
<constructor-arg type = "" value = ""></constructor-arg>表示構造函數的參數類型 和 參數值。value是值,ref是引用。
<constructor-arg index = "" value = ""></constructor-arg>表示構造函數的參數順序 和 參數值。value是值,ref是引用。
3.4 description 子標籤
<description>描述信息</description> ,作爲描述信息存在。
3.5 lookup-method子標籤
4、spring 配置bean的四種方式:註解方式、xml方式(直接映射方式、靜態工廠、實例化工廠)。
註解方式就不在這裏作介紹了。
public class Student{
private String name;
private Integer age;
public Student(){}
public Student(String name, Integer age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setAge(Integer age){
this.age = age;
}
public Integer getAge(){
return this.age;
}
}
1、xml 直接映射方式
<bean id = "student" class = "Student">
<property name = "name" value = "小明">
<property name = "age" value = "23">
</bean>
2、靜態工廠方式
bean工廠就是通過這個工廠可以得到bean。靜態工廠就是將我們的bean放在靜態區中,要用的時候調用即可。
public class StudentFactory{
public static Map<Integer, Student> map = new HashMap<>();
static{
map.put(1, new Student("小明","23"));
...
}
public static Student getStudent(Integer id){
return map.get(id);
}
}
工廠我們聲明好了,那如何才能利用這個工廠獲取我們需要的bean呢?做法如下:
<bean id = "student" class = "StudentFactory" factory-method = "getStudent">
<constructor-arg value = "1"></constructor-arg>
</bean>
爲什麼不將StudentFactory也配置成bean,而是直接就可以調用它的getStudent方法了呢?原因是:StudentFactory類中的map是在靜態塊中就已經設置完值了,而靜態塊是在加載代碼的時候就已經執行了,所以StudentFactory代碼被加載的時候,map就已經初始化完了,靜態的不需要實例化,因此student bean可以直接那樣配置。
3、實例化工廠方式
實例化工廠方式就不用靜態了。因此需要配置爲bean,否則spring找不到這個類的對象。
public class StudentFactory{
private Map<Integer, Student> map = new HashMap<>();
public StudentFactory(){
map.put(1, new Student("小明", "23"));
}
public Student getStudent(Integer id){
return map.get(id);
}
}
配置學生 bean時,要聲明factory-bean屬性。
<bean id = "studentFactory" class = "StudentFactory"></bean>
<bean id = "student" factory-bean = "studentFactory" factory-method = "getStudent">
<constuctor-arg value = "1"></constuctor-arg>
</bean>