spring(四):Spring中bean的init和destroy方法講解
本篇文章主要介紹了在spring中通過配置init-method和destroy-method方法來實現Bean的初始化和銷燬時附加的操作。
在java中,我們並不需要去管理記憶體或者變數,而在C或C++中,可以通過new和delete等方式來建立和刪除變數或者物件。在Spring中,如果想要對一個bean進行初始化和結束附加一定的操作,則可以使用上述的兩個方法來實現。
在介紹這兩個方法前,讀者需要了解Spring中bean的生命週期,最常使用的兩種生命週期是:singleton和prototype。
singleton,也就是單例
在一個應用上下文容器中,所有的執行緒或物件通過getBean獲得指定id的Bean,得到的都是同一個例項。
這種的Bean例項完全由應用上下文容器來控制宣告週期,使用者無論何時何地得到的例項都是同一個。
舉個例子,釣魚島只有一個,日本說是他們的,中國說是中國的。雖然兩方存在爭議,都覺得自己有所有權,但是釣魚島只有一個,因此我們所說的釣魚島跟日本所說的釣魚島就是同一個島:
prototype,原型
這種型別的Bean會在每一次都建立一個新的例項,而例項的生命週期僅僅由應用上下文控制其初始化和裝配,一旦初始化成功,控制權就會交給使用者。
常見的場景,例如車票或者電影票Bean例項,每次都應該是一個新的例項,因為一個票只歸屬於同一個人。
通過上面對生命週期的講解,可以瞭解到,我們在spring中使用init-method和destroy-method方法時,僅僅在預設情況即singleton模式下,destroy-method才會起作用。
下面做個小例子,做一下驗證:
舉個例子,一個舞臺Bean,我們想在使用舞臺前開啟燈光,在舞臺使用後關閉燈光再拆掉舞臺。就可以通過init-method和destroy-method來指定方法。
package com.spring.test.initdesotry; public class Stage { public void perform(){ System.out.println("演出開始..."); } public void turnOnLight(){ System.out.println("演出開始前,開燈..."); } public void turnOffLight(){ System.out.println("演出結束前,關燈..."); } }
配置bean.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="stage" class="com.spring.test.initdesotry.Stage" scope="prototype" //注意這句話,如果是singleton或者沒有該句(預設情況)時,才會執行destroy-method指定的方法,如果是當前的prototype不會觸發destroymethod的執行 init-method="turnOnLight" destroy-method="turnOffLight"/> </beans>
在主函式中,不要忘記應用上下文容器的關閉,只有這樣,才會出發destroy-method的執行。
package com.spring.test.initdesotry; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class test { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml"); Stage stage = (Stage)ctx.getBean("stage"); stage.perform(); ((ClassPathXmlApplicationContext) ctx).close();//關閉應用上下文容器,不要忘記這句話 } }
當Bean是singleton模式或者預設時,會得到如下的結果:
一月 25, 2015 1:30:42 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh 資訊: Refreshing org[email protected]4f5cb20e: startup date [Sun Jan 25 13:30:42 CST 2015]; root of context hierarchy 一月 25, 2015 1:30:42 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 資訊: Loading XML bean definitions from class path resource [bean.xml] 一月 25, 2015 1:30:42 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 資訊: Pre-instantiating singletons in org.s[email protected]68df6513: defining beans [duke,sonnet29,poeticDuke,theStage,stage]; root of factory hierarchy 演出開始前,開燈... 演出開始... 一月 25, 2015 1:30:42 下午 org.springframework.context.support.AbstractApplicationContext doClose 資訊: Closing org[email protected]4f5cb20e: startup date [Sun Jan 25 13:30:42 CST 2015]; root of context hierarchy 一月 25, 2015 1:30:42 下午 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons 資訊: Destroying singletons in org.s[email protected]68df6513: defining beans [duke,sonnet29,poeticDuke,theStage,stage]; root of factory hierarchy 演出結束前,關燈...
當是prototype模式時,得到如下的結果:
一月 25, 2015 1:05:40 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh 資訊: Refreshing org[email protected]4eadddd6: startup date [Sun Jan 25 13:05:40 CST 2015]; root of context hierarchy 一月 25, 2015 1:05:40 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 資訊: Loading XML bean definitions from class path resource [bean.xml] 一月 25, 2015 1:05:40 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 資訊: Pre-instantiating singletons in org.s[email protected]2264f82f: defining beans [duke,sonnet29,poeticDuke,theStage,stage]; root of factory hierarchy 演出開始前,開燈... 演出開始... 一月 25, 2015 1:05:40 下午 org.springframework.context.support.AbstractApplicationContext doClose 資訊: Closing org[email protected]4eadddd6: startup date [Sun Jan 25 13:05:40 CST 2015]; root of context hierarchy 一月 25, 2015 1:05:40 下午 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons 資訊: Destroying singletons in org.s[email protected]2264f82f: defining beans [duke,sonnet29,poeticDuke,theStage,stage]; root of factory hierarchy
參考
1 《Spring in Action》
相關推薦
spring(四):Spring中bean的init和destroy方法講解
本篇文章主要介紹了在spring中通過配置init-method和destroy-method方法來實現Bean的初始化和銷燬時附加的操作。 在java中,我們並不需要去管理記憶體或者變數,而在C或C++中,可以通過new和delete等方式來建立和刪除變數或者物件。
Spring的學習(四):Web中的Spring
Spring通常用來開發Web應用。 SpringMVC的執行過程: 我們可以從以下的圖來分析SpringMVC的的執行過程。 1、客戶端在傳送請求的時候,會呼叫DispatcherServlet,Dispatch是SpringMVC的入口,Dispatche
類加載(四):spring-boot-loader 模塊
sys png out gpo 技術 jar getc spa 依賴 1. spring-boot jar包結構 2、 正常情況下,java -jar的類加載器是AppClassLoader 但是spring 使用自定義的URLClassLoader加載我們寫的cl
SpringBoot2.0原始碼分析(四):spring-data-jpa分析
SpringBoot具體整合rabbitMQ可參考:SpringBoot2.0應用(四):SpringBoot2.0之spring-data-jpa JpaRepositories自動注入 當專案中存在org.springframework.data.jpa.repository.JpaRepositor
微服務架構實戰篇(四):Spring boot2.0 + Mybatis +Druid監控資料庫訪問效能
簡介 該專案主要利用Spring boot2.0 + Mybatis +Druid 實現監控資料庫訪問效能。 Druid是一個非常優秀的資料庫連線池。在功能、效能、擴充套件性方面,都超過其他資料庫連線池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSour
Spring學習筆記(四):Spring AOP詳解
一.前言 二、什麼是 AOP? AOP(Aspect Oriented Programming),即面向切面程式設計,可以說是OOP(Object Oriented Programming,面向物件程式設計)的補充和完善。OOP引入封裝、繼承、多型等概念來建立一種
Spring系列(四):Spring AOP詳解
一、AOP是什麼 AOP(面向切面程式設計),可以說是一種程式設計思想,其中的Spring AOP和AspectJ都是現實了這種程式設計思想。相對OOP(面向過程程式設計)來說,提供了另外一種程式設計方式,對於OOP過程中產生的橫切性問題,這些橫切性與業務無關,可以通過預編譯方式和執行期動態代理來實現。比
Spring Boot系列(四):Spring Boot原始碼解析
一、自動裝配原理 之前博文已經講過,@SpringBootApplication繼承了@EnableAutoConfiguration,該註解匯入了AutoConfigurationImport Selector,這個類主要是掃描spring-boot-autoconfigure下面的META-INF\
Spring(三):Spring整合Hibernate
ng- checkout wait 哪些 check driver eas package class 背景: 本文主要介紹使用spring-framework-4.3.8.RELEASE與hibernate-release-5.2.9.Final項目整合搭建
Spring(五):Spring&Struts2&Hibernate整合後,實現查詢Employee信息
view event last .html ssh tla url 配置文件 hid 背景: 基於之前兩篇文章《Spring(三):Spring整合Hibernate》、《Spring(四):Spring整合Hibernate,之後整合Struts2》,了解了
Spring(八):Spring配置Bean
兩種 exceptio 名稱 CA exception 通過 文件系統 publish 基礎 在Spring的IOC容器裏配置Bean 配置Bean形式:基於xml文件方式、基於註解的方式 在xml文件中通過bean節點配置bean: <?xml versi
Zookeeper詳解(四):Zookeeper中的zkCli.sh客戶端使用
zkCli.sh zookeeper客戶端 最好配置上環境變量連接操作:zkCli.sh -timeout 1000 -r -server 127.0.0.1 # -timeout 設置客戶端和服務器之間的超時時長,單位毫秒 # -r 只讀模式,不加就是讀寫模式 # -server IP:PORT 要
scrapy爬蟲框架(四):scrapy中 yield使用詳解
開始前的準備工作: MySQL下載:點我 python MySQL驅動下載:pymysql(pyMySql,直接用pip方式安裝) 全部安裝好之後,我們來熟悉一下pymysql模組 import pymysql #建立連結物件 connection = pymysql
tensorflow利用預訓練模型進行目標檢測(四):檢測中的精度問題以及evaluation
一、tensorflow提供的evaluation Inference and evaluation on the Open Images dataset:https://github.com/tensorflow/models/blob/master/research/object_detection/g
GitHub學習(四):Phpstorm中的git使用(2)--拉取工程與composer使用
之前我在一臺電腦上將一份不完整的工程儲存在github上,現在我回到家中,換了一臺電腦,接下來就是要用另一臺電腦拉取github中的工程,並用composer把整個工程的依賴檔案什麼亂七八糟的檔案都下下好。 1.首先開啟phpstorm,按圖
Struts2學習筆記(四):action中訪問request,session以及applicationContext等web資源的方法
在struts2的action中有時會需要訪問request,session以及applicationContext等web資源,這裡我總結了四種可行的方法,供讀者參考。 (1)使用ActionContext <pre name="code" class="java
Wine中PE格式檔案的載入(四):DLL的裝入和連線
在載入完PE可執行檔案後,回到kernel32的入口函式__wine_kernel_init中,接下來呼叫了函式LdrInitializeThunk。dll的裝入和連線過程主要是該函式實現的。函式部分程式碼如下圖所示:先用main_exe_file判斷主模組是否已經被建立了,
Java核心(四):Java中的裝箱和拆箱
https 語言 log .cn 實現 技術 沒有 object 面向 一、為什麽需要裝箱和拆箱? 基礎數據類型是數據,不是對象,也不是Object的子類。Java為每種基本數據類型都提供了對應的包裝器類型。裝箱就是自動將基本數據類型轉換為包裝器類型;拆箱就是自動將包
shell編程學習筆記(四):Shell中轉義字符的輸出
特殊 進制 .sh 簡單 轉義 版本 col 輸出 asc 通過echo可以輸出字符串,下面看一下怎麽輸出特殊轉義字符,首先我先列出來echo的轉義字符: \\ 輸入\ \a 輸出警告音 \b 退格,即向左刪除一個字符 \c 取消輸出行末的換行符,和-n選項
搭建自己的部落格(四):優化首頁和詳情頁
上一篇簡單的建立了詳情頁和首頁,這篇稍微優化一下,添加發布日期,分類,標籤以及根據標籤篩選該標籤的內容。 1、優化首頁和詳情頁 <!DOCTYPE html> <html lang="en"> <head> <meta charset