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