1. 程式人生 > >Spring Bean 生命週期之destroy——終極信仰

Spring Bean 生命週期之destroy——終極信仰

上一篇文章 Spring Bean 生命週期之我從哪裡來 說明了我是誰?我從哪裡來? 的兩大哲學問題,今天我們要討論一下終極哲學我要到哪裡去?

初始化 Spring Bean 有三種方式:

  1. @PostConstruct
  2. InitializingBean.afterPropertiesSet()
  3. init-method

銷燬 Spring Bean 同樣有三種方式:

  1. @PreDestroy
  2. DisposableBean.destroy()
  3. destroy-method

正所謂,天對地,雨對風; @PostConstruct 對 @PreDestroy;InitializingBean.afterPropertiesSet() 對 DisposableBean.destroy(); init-method 對 destroy-method;雷隱隱,霧濛濛;山花對海樹,赤日對蒼穹;平仄平仄平平仄,仄平仄平仄仄平,仄仄平……

感覺講到這沒必要講下去了,一切清晰明瞭,但我還有話要說

當 Spring Ioc 容器要移除 bean 時,銷燬相關回調方法將會被執行,這麼做的目的時釋放被 bean 持有的資源,或者去執行一些終極任務. 當 ApplicationContext 呼叫 registerShutdownHook 方法時,這些銷燬方法就會被觸發,但一般正常的業務中很少會用到這些方法

接下來具體的展示一下三種方法的使用方式

三種銷燬 Spring Bean 的方式

DisposableBean

Spring 為我們提供了 DisposableBean 介面

我們可以通過實現 DisposableBean

介面,在其唯一方法 destroy 內完成 bean 銷燬的工作,但是 Spring Framework 官方並不建議我們通過這種方法來銷燬 bean,這同樣是一種強耦合的方式,我們看到框架層面才會用到這個方法。

@PreDestroy

這種方式是 Spring 非常提倡的一種方式,我們通常將其標記在方法上即可,通常習慣將這個方法起名為 destory()

destroy-method

同樣是兩種方式,第一種方式:

第二種方式

以上三種 Bean 的銷燬方式也是可以組合使用的,那麼組合在一起的呼叫順序是什麼呢?

  1. 首先 @PreDestroy 會被呼叫
  2. 其次 DisposableBean.destroy() 會被呼叫
  3. 最後呼叫通過 XML 配置的 destroy-method 方法或通過設定 @Bean 註解 設定 destroyMethod 屬性的方法

用圖示來說明一下呼叫順序

這個呼叫順序也不難記憶

PreDestroy (P),destroy (D),destroy-method (D) ---> PDD (那個3億人都在 pin 的那個 APP 名稱,目前 3 億人中沒有我)

再來看看 Spring Bean 生命週期圖,我們已經點亮了核心部分:

我們要注意,在銷燬的過程並沒有類似 BeanPostProcess 那中切面的思想,這裡要注意到區別。

靈魂追問

  1. 在閱讀框架原始碼時,哪些地方用到了 bean 的銷燬方法?
  2. 還沒有被點亮的地方,你認為還有哪些內容沒有做?

提高效率工具


推薦閱讀

  • 面試還不知道 BeanFactory 和 ApplicationContext 的區別?
  • Spring Bean 生命週期之"我從哪裡來?",懂得這個很重要
  • Spring Bean 生命週期之"我要到哪裡去?"
  • 如何設計好的RESTful API
  • 輕鬆高效玩轉DTO(Data Transfer Object)

歡迎持續關注公眾號:「日拱一兵」

  • 前沿 Java 技術乾貨分享
  • 高效工具彙總
  • 面試問題分析與解答
  • 技術資料領取

後續會出一系列文章點亮上圖,同時進行 Spring 知識點解釋與串聯,在工作中充分利用 Spring 的特性
另外,還會推出 Java 多執行緒與 ElasticSearch 相關內容

持續關注,帶你像讀偵探小說一樣輕鬆趣味學習 Java 技術棧相關知識

相關推薦

Spring Bean 生命週期destroy——終極信仰

上一篇文章 Spring Bean 生命週期之我從哪裡來 說明了我是誰? 和 我從哪裡來? 的兩大哲學問題,今天我們要討論一下終極哲學我要到哪裡去? 初始化 Spring Bean 有三種方式: @PostConstruct InitializingBean.afterPropertiesSet() i

spring-bean生命週期初始化和銷燬的三種方式

1,註解bean之指定init-method/destroy-method 這種方式spring註解之@Bean註解,這邊再簡單演示如下: 配置類中增加一個bean如下: /** * 定義一個bean物件 * @return */

Spring Bean 生命週期“我從哪裡來?” 懂得這個很重要

Spring bean 的生命週期很容易理解。例項化 bean 時,可能需要執行一些初始化以使其進入可用 (Ready for Use)狀態。類似地,當不再需要 bean 並將其從容器中移除時,可能需要進行一些清理,這就是它的生命週期 上一篇文章 面試還不知道BeanFactory和Applicati

Spring Bean生命週期回撥——初始化回撥(init-method)與銷燬回撥(destroy-method)

實現Bean初始化回撥和銷燬回撥各有三種方法,一是實現介面方法,二是在XML配置,三是使用註解 初始化回撥(init-method) 1、使用介面 org.springframework.beans.factory.InitializingBean介面類的作用是:在容器設定bean必

5.Spring Bean生命週期.md

文章目錄 5.Spring Bean生命週期 生命週期流程圖 說明 總結 5.Spring Bean生命週期 生命週期流程圖 說明 *呼叫InstantitationAwareBeanP

Spring Bean生命週期詳解

  在Spring中 Bean 可謂是一個核心的元素,當我們結合Spring進行程式設計的時候也離不開Bean,面對這樣重要的一個角色,瞭解其生命週期和該生命週期所涉及的環節對我們更加熟練靈活地使用Bean是很有Bean必要的,下面我們就來詳細分析下Bean的生

Spring Bean生命週期

spring bean的生命週期 spring bean生命週期1、Spring對bean進行例項化; 2、Spring將值和bean的引用注入到bean對應的屬性中; 3、如果bean實現了BeanNameAware介面,Spring將bean的ID傳遞給setBea

從原始碼看Spring bean 生命週期

在Spring中,bean一般都以單例模式存在,除非我們將singleton屬性設為false。 單例在多執行緒的環境下需要考慮執行緒安全的問題,對於一些公共的資源或資料應該怎麼處理才能保證安全,應該在什麼時機訪問這些資源最恰當。 熟悉了spring bean的整個生命週

一步步剖析spring bean生命週期

 關於spring bean的生命週期,是深入學習spring的基礎,也是難點,本篇文章將採用程式碼+圖文結論的方式來闡述spring bean的生命週期, 本篇文章將闡述清楚下圖。    一  專案結構及原始碼 1.程式目錄結構  2.ap

SpringBean生命週期[email protected]方法進行物件的初始化

方法:通過@Bean指定init-method和destroy-method; 注:單例項和原型模式物件的建立時間和初始化銷燬的時間順序不同。 一、單例項模式 1、建立Car例項物件,並建立初始化和銷燬方法 package com.atguigu.bean; imp

Spring Bean生命週期我的理解(三)------BeanFactory和FactoryBean

前言 大家可能使用Spring框架已經很久了,但是對其中的一些概念可能會比較模糊,比如BeanFactory和FactoryBean,詐一看,兩個沒啥區別,仔細研究後發現,其實本質上是兩個不同的單元。 概念 BeanFactory 字面意思講就是

Spring Bean生命週期我的理解(五)------InitializingBean

前言 Spring Bean建立後,提供了針對於Bean的兩種初始化方式: 實現InitializingBean介面; 設定init-method屬性; 本文介紹的是實現InitializingBean介面的方式; 實現 1.定義MyIniti

2.SpringBean生命週期和組裝方式

1.Spring IoC容器概述    Spring IoC容器:      Spring容器即體現了IoC原理    Spring容器通過讀取配置元資料負責對Beans例項化、配置和裝配     配置元資

Spring註解】2、Bean生命週期

1、初始化和銷燬 通過@Bean註解的initMethod和destroyMethod屬性 InitializingBean介面、DisposableBean介面 可以使用JSR250: @PostConstruct:在Bean建立完成並且屬性

Spring 5 設計模式 - bean生命週期和使用的模式

Spring 5 設計模式 - bean生命週期和使用的模式 生命週期和階段 初始化階段 載入bean定義 初始化bean例項 使用BeanPostProcessor自定義bean 初始化擴充套件點

Spring原始碼系列 — Bean生命週期

前言 上篇文章中介紹了Spring容器的擴充套件點,這個是在Bean的建立過程之前執行的邏輯。承接擴充套件點之後,就是Spring容器的另一個核心:Bean的生命週期過程。這個生命週期過程大致經歷了一下的幾個階段 在本節中重點介紹例項化、填充裝配、喚醒Aware方法、BeanPostProce

springbean生命週期

我們都知道servlet的生命週期是:例項化、初始化、接受處理請求、銷燬。 spring上下文中bean也是類似的: 我們的bean都是交給spring管理的,也就是我們將bean的建立、管理控制權都交給了spring容器也稱為IOC容器 當然IOC容器初始化時

總結Spring框架擴充套件點(二)bean生命週期中的擴充套件點(持續更新中...)

面向業務開發的時候,程式設計師需要明白業務的邏輯,並設計程式碼結構。而在進行中介軟體開發的時候,則需要明白框架的邏輯,進行開發。 所以要開發提供給spring的中介軟體,需要知道spring中有哪些擴充套件點,好在對應的地方插入我們的功能。 1. Spring容器初始化b

Bean管理生命週期BeanPostProcessor

package com.imooc.ioc.demo3; public interface UserDao { public void findAll(); public void

Spring的IOC、Spring物件初始化bean時機、Spring容器生命週期

IOC指的是控制反轉,把物件的建立、初始化、銷燬等工作都交給Spring容器。由spring容器來控制物件的生命週期。 Spring物件初始化bean時機: 在預設情況下,只要在Spring容器中配置了一個bean,容器在啟動時就會例項化該bean,單例模式。 如果在Spr