詳解Spring中Bean的作用域與生命周期
一、Bean的作用域
通過(guò)Spring容器創(chuàng)建一個(gè)Bean的實(shí)例時(shí),不僅可以完成Bean的實(shí)例化,還可以使用Bean的scope屬性為bean設(shè)置作用域。
語(yǔ)法格式:<bean id="別名" scope="作用域" class="對(duì)應(yīng)實(shí)現(xiàn)類">
作用域的種類:(sing)
singleton和prototype區(qū)別:(該兩種比較常用)
① singleton單實(shí)例,prototype多實(shí)例
② 設(shè)置scope值是singleton時(shí)候,加載spring配置文件時(shí)候就會(huì)創(chuàng)建單實(shí)例對(duì)象
設(shè)置scope值是prototype時(shí)候,在加載spring配置文件時(shí)候暫時(shí)不會(huì)創(chuàng)建對(duì)象,在調(diào)用getBean方法時(shí)候才創(chuàng)建多實(shí)例對(duì)象
singleton作用域:
//Cat.java public class Cat { private String name; public void setName(String name) { this.name = name; } }
配置文件beans5.xml
<bean id="cat" scope="singleton" class="com.jd.dao.Cat"> <property name="name" value="大橘"></property> </bean>
測(cè)試:
//Bean的作用域測(cè)試方法 @Test public void catTest(){ //1.初始化Spring容器,加載配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans5.xml"); //2.通過(guò)Spring容器獲取Bean的實(shí)例 Cat cat1 = (Cat) applicationContext.getBean("cat"); Cat cat2 = (Cat) applicationContext.getBean("cat"); //3.輸出獲取的實(shí)例 System.out.println(cat1); System.out.println(cat2); }
prototype作用域:
將配置文件beans5.xml中的scope屬性改為prototype,再次運(yùn)行測(cè)試:
<bean id="cat" scope="prototype" class="com.jd.dao.Cat"> <property name="name" value="大橘"></property> </bean>
3測(cè)試:
二、Bean的生命周期
Bean從創(chuàng)建到銷毀稱為Bean的生命周期,大體上Bean的生命周期共有七步:
(1)通過(guò)無(wú)參構(gòu)造器創(chuàng)建bean實(shí)例
(2)調(diào)用屬性setter方法為bean的屬性設(shè)置值
(3)把bean實(shí)例傳遞bean后置處理器的方法postProcessBeforeInitialization
(4)調(diào)用bean的初始化的方法(需要配置初始化的方法)
(5)把bean實(shí)例傳遞bean后置處理器的方法postProcessAfterInitialization
(6)獲取使用已經(jīng)創(chuàng)建的bean
(7)當(dāng)容器關(guān)閉時(shí)候,調(diào)用bean的銷毀的方法(需要配置銷毀的方法)
注意:
① 初始化方法、銷毀方法都需要在Bean中作為屬性手動(dòng)配置;
② 只有singleton作用域的Bean才會(huì)執(zhí)行銷毀方法;
使用代碼演示Bean的生命周期
(1)普通Java Bean:Cat.java
public class Cat { private String name; public void setName(String name) { this.name = name; System.out.println("第二步:調(diào)用屬性setter方法為bean的屬性設(shè)置值"); } public Cat(){ System.out.println("第一步;通過(guò)無(wú)參構(gòu)造器創(chuàng)建bean實(shí)例"); } //初始化方法(在配置文件中配置實(shí)現(xiàn)調(diào)用) public void initMethod(){ System.out.println("第四步:調(diào)用bean的初始化的方法"); } //銷毀方法(在配置文件中配置實(shí)現(xiàn)調(diào)用) public void destroyMethod(){ System.out.println("第七步:當(dāng)容器關(guān)閉時(shí)候,調(diào)用bean的銷毀的方法"); } }
(2)myBeanPostProcessor實(shí)現(xiàn)BeanPostProcessor接口,實(shí)現(xiàn)后置處理器:myBeanPostProcessor.java
(spring中的AOP就是通過(guò)實(shí)現(xiàn)BeanPostProcessor接口實(shí)現(xiàn)的)
//myBeanPostProcessor實(shí)現(xiàn)BeanPostProcessor接口,實(shí)現(xiàn)后置處理器 public class myBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("第三步:把bean實(shí)例傳遞bean后置處理器的方法"); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("第五步:把bean實(shí)例傳遞bean后置處理器的方法"); return bean; } }
(3)配置文件:beans5.xml
<!--scope屬性必須設(shè)置為singleton,否則創(chuàng)建的Bean不會(huì)被銷毀--> <!--init-method屬性配置初始化方法,destroy-method屬性銷毀方法--> <bean id="cat" scope="singleton" class="com.jd.dao.Cat" init-method="initMethod" destroy-method="destroyMethod"> <property name="name" value="大橘"></property> </bean> <!--配置后置處理器,為當(dāng)前配置文件中的所有bean添加后置處理器的處理--> <bean id="myBeanPostProcessor" class="com.jd.dao.myBeanPostProcessor"></bean>
(4)測(cè)試
@Test public void catTest(){ //1.初始化Spring容器,加載配置文件 ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans5.xml"); //2.通過(guò)Spring容器獲取Bean的實(shí)例 Cat cat = (Cat) applicationContext.getBean("cat"); //3.輸出獲取的實(shí)例 System.out.println("第六步:獲取創(chuàng)建Bean實(shí)例"+cat); //4.手動(dòng)關(guān)閉 applicationContext.close(); }
到此這篇關(guān)于詳解Spring中Bean的作用域與生命周期的文章就介紹到這了,更多相關(guān)Spring Bean的作用域與生命周期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解Spring中Bean的生命周期和作用域及實(shí)現(xiàn)方式
- 淺談Spring中Bean的作用域、生命周期
- Spring實(shí)戰(zhàn)之Bean的作用域request用法分析
- Spring實(shí)戰(zhàn)之Bean的作用域singleton和prototype用法分析
- 深入了解Spring中Bean的作用域和生命周期
- spring ioc的簡(jiǎn)單實(shí)例及bean的作用域?qū)傩越馕?/a>
- JSP 中Spring Bean 的作用域詳解
- 簡(jiǎn)單了解spring bean作用域?qū)傩詓ingleton和prototype的區(qū)別
- Spring中Bean的作用域與生命周期詳解
- Spring?框架中的?Bean?作用域(Scope)使用詳解
相關(guān)文章
Struts2攔截器Interceptor的原理與配置實(shí)例詳解
攔截器是一種AOP(面向切面編程)思想的編程方式.它提供一種機(jī)制是開發(fā)者能夠把相對(duì)獨(dú)立的代碼抽離出來(lái),配置到Action前后執(zhí)行。下面這篇文章主要給大家介紹了關(guān)于Struts2攔截器Interceptor的原理與配置的相關(guān)資料,需要的朋友可以參考下。2017-11-11Java ArrayList.add 的實(shí)現(xiàn)方法
這篇文章主要介紹了Java ArrayList.add 的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11Java中集合List、Set和Map的入門詳細(xì)介紹
Java集合主要分為三種類型:Set(集)、List(列表)和Map(映射),下面這篇文章主要給大家介紹了關(guān)于Java中集合List、Set和Map的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01Java微信公眾平臺(tái)開發(fā)(12) 微信用戶信息的獲取
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺(tái)開發(fā)第十二步,微信用戶信息的獲取,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Java女裝商城系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)女裝商城系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11Java JVM原理與調(diào)優(yōu)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫,JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)的。下面通過(guò)本文給大家介紹jvm原理與調(diào)優(yōu)相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧2017-04-04