spring xml配置 bean beans標籤及其子標籤的全部屬性詳解

目錄

1、標籤的屬性

2、標籤的屬性

3、標籤的子標籤

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>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章