1. 程式人生 > >Spring bean 的初始化和銷燬的三種方式和執行順序

Spring bean 的初始化和銷燬的三種方式和執行順序

Spring 容器中的 Bean 是有生命週期的,spring 允許 Bean 在初始化完成後以及銷燬前執行特定的操作。 下面是常用的三種指定特定操作的方法:
  • 通過實現InitializingBean/DisposableBean 介面來定製初始化之後/銷燬之前的操作方法; 
  • 通過<bean> 元素的init-method/destroy-method屬性指定初始化之後 /銷燬之前呼叫的操作方法;
  • 在指定方法上加上@PostConstruct或@PreDestroy註解來制定該方法是在初始化之後還是銷燬之前呼叫。

這幾種配置方式,執行順序是怎樣的呢?我們通過例子來研究下:

Bean的列子類:InitBeanAndDestroyBean.java

package com.chenfeng.xiaolyuh.entity;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class InitBeanAndDestroyBean implements InitializingBean, DisposableBean {
	public String say() {
		return "Hello!" + this.getClass().getName();
	}

	public InitBeanAndDestroyBean() {
		System.out.println("執行InitBeanAndDestroyBean構造方法");
	}

	@Override
	public void destroy() throws Exception {
		System.out.println("介面-執行InitBeanAndDestroyBeanTest:destroy方法");
	}

	@Override
	public void afterPropertiesSet() throws Exception {
		System.out.println("介面-執行InitBeanAndDestroyBeanTest:afterPropertiesSet方法");
	}

	@PostConstruct
	public void postConstructstroy() {
		System.out.println("註解-執行InitBeanAndDestroyBeanTest:preDestroy方法");
	}

	@PreDestroy
	public void preDestroy() {
		System.out.println("註解--執行InitBeanAndDestroyBeanTest:preDestroy方法");
	}

	public void initMethod() {
		System.out.println("XML配置-執行InitBeanAndDestroyBeanTest:init-method方法");
	}

	public void destroyMethod() {
		System.out.println("XML配置-執行InitBeanAndDestroyBeanTest:destroy-method方法");
	}
}


Spring配置類MyConfig.java
@Configuration // 宣告成配置檔案
@ComponentScan("com.chenfeng.xiaolyuh") // 掃描包
public class MyConfig {
	
	// 測試Bean的幾種初始化和銷燬方式,和執行順序
	@Bean(initMethod="initMethod", destroyMethod="destroyMethod")
	public InitBeanAndDestroyBean initBeanAndDestroyBean() {
		return new InitBeanAndDestroyBean();
	}
}
測試類SpringIocTest.java
public class SpringIocTest {
    // 使用容器
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class, CatEntity.class);

    @Test
    public void contextTest() {
    	// 測試Bean的三種初始化、銷燬方式和執行順序
    	System.out.println(context.getBean(InitBeanAndDestroyBean.class));
    }
    
    @After
    public void closeContext() {
    	context.close();
    }

}


列印結果:

三月 10, 2017 1:47:02 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
資訊: Refreshing org.spring[email protected]3b22cdd0: startup date [Fri Mar 10 13:47:02 CST 2017]; root of context hierarchy
執行InitBeanAndDestroyBean構造方法
註解-執行InitBeanAndDestroyBeanTest:preDestroy方法
介面-執行InitBeanAndDestroyBeanTest:afterPropertiesSet方法
XML配置-執行InitBeanAndDestroyBeanTest:init-method方法

三月 10, 2017 1:47:02 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
資訊: Closing org.spring[email protected]3b22cdd0: startup date [Fri Mar 10 13:47:02 CST 2017]; root of context hierarchy
註解--執行InitBeanAndDestroyBeanTest:preDestroy方法
介面-執行InitBeanAndDestroyBeanTest:destroy方法
XML配置-執行InitBeanAndDestroyBeanTest:destroy-method方法

從執行結果可以看出: 

  • Bean在例項化的過程中:Constructor > @PostConstruct >InitializingBean > init-method
  • Bean在銷燬的過程中:@PreDestroy > DisposableBean > destroy-method

相關推薦

Spring管理的bean初始方法的方式,以及@PostConstruct不起作用的原因

1:Spring 容器中的 Bean 是有生命週期的,spring 允許 Bean 在初始化完成後以及銷燬前執行特定的操作。下面是常用的三種指定特定操作的方法: 通過實現InitializingBean/DisposableBean 介面來定製初始化之後/銷燬之前的操作

Spring bean初始銷燬方式及優先順序

  Spring bean的初始化和銷燬有三種方式   通過實現 InitializingBean/DisposableBean 介面來定製初始化之後/銷燬之前的操作方法;優先順序第二   通過 元素的 init-method/destroy-method屬性指定初始化之

Spring Bean初始之後/銷燬之前執行指定方法

關於在spring  容器初始化 bean 和銷燬前所做的操作定義方式有三種: 通過@PostConstruct 和 @PreDestroy 方法 實現初始化和銷燬bean之前進行的操作 通過 在xml中定義init-method 和  destory-metho

spring(bean初始銷燬、注入,作用域)

IOC:控制反轉,也稱為依賴注入(DI)。這是一個過程。通常我們需要一個物件的時候,是主動建立物件,並且主動傳入到需要使用該物件的地方。而IOC則是由容器建立物件,注入到我們需要使用該物件的位置,兩者相比,一個主動,一個被動,被動的則是稱為依賴注入(控制反轉,由主動建立改為被動注入)。IO

JAVA中初始ArrayList的方式

  下面講一下ArrayList初始化的幾種不同方式。   一、最常用的初始化方式。 1 List<String> list1 = new ArrayList<String>(); 2 list1.add("apple"); 3 lis

spring boot初始資源的幾方式

轉自:https://www.jb51.net/article/145143.htm 實現 CommandLineRunner 介面,並實現它的 run() 方法,在該方法中編寫初始化邏輯 @Component public class MyCommandLineRun

結構體初始 訪問的方式(結構體指標)

輸出三個學生中成績最高的學生資訊 1>  #include<stdio.h> typedef struct student {     int num;     char name[10];     int score; } Student; int m

Spring bean初始銷燬方式執行順序

Spring 容器中的 Bean 是有生命週期的,spring 允許 Bean 在初始化完成後以及銷燬前執行特定的操作。 下面是常用的三種指定特定操作的方法: 通過實現InitializingBean/DisposableBean 介面來定製初始化之後/銷燬之前的操作方法;

Spring bean初始與銷毀的幾方式區別

pack ack 構造 rop struct service() throws esc println 1. <bean> 元素的 init-method/destroy-method屬性指定初始化之後 /銷毀之前調用的操作方法 2. 指定方法上加上@PostC

Spring定義bean方式自動注入

前言:隨著一個專案規模的增大,我們不得不引入許多Java bean物件,而這些物件一般來說是在Spring的配置檔案applicationContext.xml中進行配置的,這樣就聲明瞭這是一個由Spring容器管理的bean物件。這種做法必然會導致Spring的配置檔案的

Spring Bean 初始之InitializingBean, init-method PostConstruct

概述從介面的名字上不難發現,InitializingBean 的作用就是在 bean 初始化後執行定製化的操作。Spring 容器中的 Bean 是有生命週期的,Spring 允許在 Bean 在初始化完成後以及 Bean 銷燬前執行特定的操作,常用的設定方式有以下三種:通過實現 InitializingBe

&#128584;羞,Spring Bean 初始/銷燬竟然有這麼多姿勢

文章來源:http://1t.click/bfHN 一、前言 日常開發過程有時需要在應用啟動之後載入某些資源,或者在應用關閉之前釋放資源。Spring 框架提供相關功能,圍繞 Spring Bean 生命週期,可以在 Bean 建立過程初始化資源,以及銷燬 Bean 過程釋放資源。Spring 提供多

Jquery 頁面初始常用的方法以及Jquery 發送ajax 請求

tree error 渲染 erro 發生 har 初始化 nload 事情 第一種 $(document).ready(function(){ //文檔就緒事件 }); 第二種是第一種的簡略寫法,效果上和第一種是等效的。 $(function(){ //文檔加載事

jQuery頁面加載初始常用的方法

ini ready document 加載 clas 初始 ora win eth 當頁面打開時我們需要執行一些操作,這個時候如果我們選擇使用jquery的話,需要重寫他的3中方法,自我感覺沒什麽區 別,看個人喜好了,第二種感覺比較簡單明了: 第一種: 復制代碼代碼如下:

Spring Bean初始之後執行指定方法

轉載:https://blog.csdn.net/forever7107/article/details/76446544 常用的設定方式有以下三種: 通過實現 InitializingBean/DisposableBean 介面來定製初始化之後/銷燬之前的操作方法; 通過 <bean&g

spring在web容器啟動時執行初始方法(四方式

需求:在tomcat啟動時開啟一個定時任務,或初始化slor索引 想法:容器啟動時執行方法,最容易想到的就是servlet中可以配置load-on-startup,設定一個正整數也就可以隨容器一起啟動。 問題:上面的方法很好,但是由於定時任務需要去操作資料庫,而專案

Spring bean初始原理詳解

一、  閒言 使用spring已經多年,卻從來沒有仔細研究過spring bean的初始化過程以及原理。知其然而不知其所以然,當面遇到比較深度的問題的時候,就無法解決或者需要花費大量問題方可解決。 二、  目的 本文主要想解決以下幾個問題,希望大家看完本文以後,能得出答案

spring 初始ApplicationContext的幾方式

最近做專案需要用到getBean(),在網上搜索之後發現有很多種方式獲取ApplicationContext,做了些許嘗試,解決了我的問題,決定把搜到的東西進行彙總,供大家學習。 方法一:Fi

jQuery頁面載入初始常用的方法

當頁面開啟時我們需要執行一些操作,下面為大家介紹三種不錯的方法,大家可以參考下 當頁面開啟時我們需要執行一些操作,這個時候如果我們選擇使用jquery的話,需要重寫他的3中方法,自我感覺沒什麼區

Spring Boot中初始資源的幾方式

  假設有這麼一個需求,要求在專案啟動過程中,完成執行緒池的初始化,加密證書載入等功能,你會怎麼做?如果沒想好答案,請接著往下看。今天介紹幾種在Spring Boot中進行資源初始化的方式,幫助大家解決和回答這個問題。CommandLineRunner定義初始化類 MyCommandL