Spirng學習四-SpringBean的作用域

Bean注入的三種方式

1:使用默認的構造函數

在spring的配置文件中使用bean標籤,配以id和class屬性之後,且沒有其他屬性和標籤時採用的就是默認的構造函數常見bean對象,此時如果沒有默認構造函數則對象無法創建。

<bean name="car" class="impl.Car"/> 

2.使用普通工廠的方法創建對象(使用某個類中的方法創建對象,交給spring管理)

比如jar包中的class中某個方法創建了一個對象現在希望通過它來獲得對象交給spring管理

public class BeanFactory2 {
    public Car getCar(){
        return new Car();
    }
}

首先將該類交給Spring管理,之後通過beanName指定該類通過factory-method指定通過該類中getCar方法獲得對象。

 <bean name="factory" class="com.factory.BeanFactory2"></bean>
<bean name="factoryCar" factory-bean="factory" factory-method="getCar"></bean>

3.使用工廠中的靜態方法創建對象

基於上面的工廠方法獲得對象,在工廠類的方法是static修飾的靜態方法的時候可以直接通過如下配置加載。

<bean name="factoryCar" class="com.factory.BeanFactory2" factory-method="getCar"></bean>

Bean的作用域

在Spring容器中一共提供了五種作用域類型,在配置文件中通過屬性scope來設置bean的作用域範圍。

1.默認 singleton:單例

<bean name="car" class="impl.Car" scope="singleton"/> 

在對scope沒有設置的時候bean默認就是單例的,多次獲取同一個id都是一個bean的實例。

     //此時容器初始化完畢後可以取裏面的bean了.
        Car car1  = (Car)bf.getBean("car");
        Car car2 = (Car)bf.getBean("car");
        System.out.println(car1 == car2);

執行結果:

小汽車被加載了
true

2. prototype:多例

xml <bean name="car" class="impl.Car" scope="prototype"/>
每次通過id獲取bean的時候IOC都會創建一個新的作用域。
同樣執行執行上面的代碼
執行結果:

小汽車被加載了
小汽車被加載了
false

###以下三種針對web項目
在使用Spring的WebApplicationContext時,可以使用的作用域。
###3.request:HTTP請求

<bean name="car" class="impl.Car" scope="request"/>

request針對每次Http請求,Spring都會針對相關的bean來創建一個新的實例。而bean只在當前request請求中有效

4.session

<bean name="car" class="impl.Car" scope="session "/>

針對http session起作用,Spring容器會根據該Bean的定義來創建一個全新的Bean的實例。而且該Bean只在當前http session內是有效的。
Session中所有http請求共享同一個請求的bean實例。Session結束後就銷燬bean。

5.global session:

<bean name="car" class="impl.Car" scope="globalSession"/>

類似標準的http session作用域,不過僅僅在基於portlet的web應用當中纔有意義。Portlet規範定義了全局的Session的概念。他被所有構成某個portlet外部應用中的各種不同的portlet所共享。在global session作用域中所定義的bean被限定於全局的portlet session的生命週期範圍之內。

Bean的生命週期

bean對象的生命週期分爲創建、生存、死亡
單例:

<bean  name="car" class="com.pojo.Car" init-method="init" destroy-method="destroy"></bean>

爲bean配置加入init-method 屬性和destroy-method屬性,分別在對象加載和容器銷燬時執行該類中的init方法和destroy方法。

 ClassPathXmlApplicationContext ap = new ClassPathXmlApplicationContext("applicationContext.xml");
ap.getBean("car");

//手動關閉容器
ap.close();

執行結果:

加載小汽車
執行對象初始化方法
六月 08, 2019 10:41:25 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
執行對象銷燬方法

多例:

<bean  name="car" class="com.pojo.Car" init-method="init" destroy-method="destroy" scope="prototype"></bean>

執行結果:

加載小汽車
執行對象初始化方法

可見調用close並沒有調用destroy方法,這就是與單例模式的區別,多例模式bean的生命週期交給了JVM管理。
總結:
單例對象
出生:容器創建時對象加載
存活:容器還在對象就一直存在
死亡:對象的聲明週期和容器相同
多例對象
出生:當使用對象時由bean工廠創建
存活:對象在使用過程中就一直存活
死亡:交給JVM管理對象生命週期

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