1. 程式人生 > >spring(四):Spring中bean的init和destroy方法講解

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》

相關推薦

springSpringbean的initdestroy方法講解

本篇文章主要介紹了在spring中通過配置init-method和destroy-method方法來實現Bean的初始化和銷燬時附加的操作。 在java中,我們並不需要去管理記憶體或者變數,而在C或C++中,可以通過new和delete等方式來建立和刪除變數或者物件。

Spring的學習WebSpring

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\

SpringSpring整合Hibernate

ng- checkout wait 哪些 check driver eas package class 背景:   本文主要介紹使用spring-framework-4.3.8.RELEASE與hibernate-release-5.2.9.Final項目整合搭建

SpringSpring&Struts2&Hibernate整合後,實現查詢Employee信息

view event last .html ssh tla url 配置文件 hid 背景:   基於之前兩篇文章《Spring(三):Spring整合Hibernate》、《Spring(四):Spring整合Hibernate,之後整合Struts2》,了解了

SpringSpring配置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

WinePE格式檔案的載入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