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管理對象生命週期