1. 程式人生 > >Spring生命週期不可不知的回撥介面

Spring生命週期不可不知的回撥介面

上回說到 Spring bean生命週期中的InitializingBean介面,我們瞭解到這只是spring bean生命週期中修改bean的諸多方式之一,其實在整個生命週期中,修改bean的方式大致有如下幾種:

  1. 實現 InitializingBean介面  afterPropertiesSet() 

  2. 實現 DisposableBean介面的 destroy()

  3. 給方法加@PostConstruct@PreDestroy註解,需要說明一點,這兩個註解是JSR250標準中的,而SpringInitDestroyAnnotationBeanPostProcessor類實現了這個標準

  4. xml的方式定義bean時,指定init methoddestroy method

    <bean id="testBeanLifeCycle" class="org.springframework.samples.mvc.beanPostProcessor.TestBeanLiftCycle"
         
    init-method="xmlInit" destroy-method="xmlDestroy">
       <property
    name="message" value="Hello World!"/</bean>

在眾多的lifecycle機制中,假設一個bean使用了上邊所有的方式,那麼它們的執行順序是這樣的:

  • Methods annotated with @PostConstruct

  • afterPropertiesSet() as defined by the InitializingBean callback interface

  • A custom configured init() method

  • Methods annotated with @PreDestroy

  • destroy() as defined by the DisposableBean callback interface

  • A custom configured destroy() method

我們在程式碼中來看

在Spring中,bean的生命週期管理都是由beanFactory來管理,上一篇我們有提到,實現了beanFactory的類AbstractAutowiredCapableBeanFactory完成了bean的init和destroy的工作,初始化方法是

invokeInitMethods方法如下

接下來看看destroy邏輯,在AbstractAutowiredCapableBeanFactory中我們找到destroy方法

再來看DisposableBeanAdapter的destroy做了什麼

來看個小demo來驗明正身

  • 定義Spring bean TestBeanLifeCycle

  • applicationContext.xml中宣告bean

  • Junit方式啟動容器

  • 然後我們會看到下面的輸出:

說了這麼多機制,那麼我們在使用的時候要注意什麼

推薦使用@PostConstruct@PreDestroy,因為這來自JSR250,Spring框架0耦合。

除此之外,Spring還提供了LifeCycle介面和LifeCycleProcessor介面,實現這些介面能讓beanlifecycle關聯到ContainerlifeCycle,當容器有啟動,停止,重新整理等動作時,會回撥到bean

如果說所有這些Spring提供的機制還是不能滿足你的需求,那麼總有一款適合你——BeanPostProcessor介面,事實上在Spring架構內部,眾多的beanPostProcessor實現,能完成各種介面的回撥,或者自定義方法的觸發。關於更多BeanPostProcessor,且聽下回分解。

歡迎關注,期待與您的交流,讓我們攜手在通往牛逼的小路上徐徐前行。

相關推薦

Spring生命週期不可不知介面

上回說到 Spring bean生命週期中的InitializingBean介面,我們瞭解到這只是spring bean生命週期中修改bean的諸多方式之一,其實在整個生命週期中,修改bean的方式大致有如下幾種: 實現 InitializingBean介面 的 afterPropertiesSet

Android--測試Activity的生命週期事件及其方法

//activity_main.xml <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="h

C#POST 支付寶/微信介面

一般支付寶/微信的回撥介面都會返回xml格式,下面是呼叫類似這種介面的辦法: public async Task<string> GetData() { string requestUrl = "http://localhost:xxx/xx/xxxx/xxx/xxxx

從原始碼角度看Spring生命週期(官方最全)

Spring在beanfactory中給出了spring的生命週期的list列表 一、bean初始化前的處理 Bean factory implementations should support the standard bean lifecycle interfaces as

淺析微信支付:申請退款、退款介面、查詢退款

本文是【淺析微信支付】系列文章的第八篇,主要講解商戶如何處理微信申請退款、退款回撥、查詢退款介面,其中有一些坑的地方,會著重強調。 淺析微信支付系列已經更新七篇了喲~,沒有看過的朋友們可以看一下哦。 淺析微信支付:查詢訂單和關閉訂單 淺析微信支付:支付結果通知 淺析微信支付:統一下單介面

Android中點選事件介面踩坑心得

有時候寫程式碼的時候有這樣的功能要求,如在ListView或recyclerView中的Item中的控制元件(如Button,TextView)上添加回調介面事件。其實難點就在添加回調介面事件上,怎麼寫介面,介面回撥在哪裡,這才是關鍵。下面是個例子: 介面的寫法:一下是兩介

spring原始碼分析:spring生命週期

接著上一篇我們看看具體是哪裡的程式碼執行了。 1.初始化BeanFactoryPostProcessor invokeBeanFactoryPostProcessors(beanFactory);--> PostProcessorRegistrationDelegate.

spring原始碼分析:spring生命週期

最近在看springboot自動配置,看到了@Conditional,@ConditionalOnMissingBean等等。這些註解,一直研究他們是如何實現springboot的條件註解的。由他們回到了@Configuration,回到了ConfigurationClassPostPr

[Android]RecyclerView基本使用+adapter介面實現點選事件

一、概述 RrcyclerView是ListView的加強版,不僅可以輕鬆實現和ListView同樣的效果,還優化了ListView中存在的各種不同之處。 Android官方推薦我們使用RecyclerView。 二、基本用法 1.首先需要在專案的build.gradle中新增相

第三方支付平臺支付介面介面開發

作為開放式的B/S架構程式,無論所屬電商,金融,機械製造,企業OA,ERP,CRM,CMS等等行業或系統中,第三方支付以及銀聯支付的業務一定是客戶關心所在,也是保證客戶系統盈利運營的一個重要保障。通常這種B2C或者C2C系統的開發,商戶使用者所關注的支付平臺大多離不開“阿里支付寶,快錢,騰訊財付通,易寶支

解決:接入微信支付,調不起介面WXPayEntryActivity

最近開發公司SDK需要接入微信支付功能,於是上了微信開發者平臺,下載微信的SDK,按著文件接入。當我進行微信支付,需要調起微信客戶端,但是卻沒有。而微信回撥WXPayEntryActivity也沒有被回撥起來。這就很奇怪了,看回文件,說要把WXPayEntryActivity

Spring中模板模式和模式(一)

模板模式 public abstract class TemplatePattern { //模板方法 public final void templateMethod(){ method1();

一個自定義dialog提供確定和取消按鈕的介面

public class MessageDialog { Context context; AlertDialog dialog; AlertDialog.Builder bu

android 萬能介面

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">剛做android開發時經常遇到資料傳遞的問題,因為對Java也不是很熟

基於Fragment介面委託工作任務給託管Activity

要委託工作任務給託管activity,通常的做法是由fragment定義名為Callbacks的回撥介面。 回撥介面定義fragment委託給Activity處理的工作任務。 任何打算託管fragment的Activity都必須實現它。 有了回撥介面,就不

android中的-介面

發現很多初學者對於回撥,介面,抽象  等概念理解的不是很透徹。 今天就以我的經驗把 介面回撥給大家闡述一下。適合初學者看看。 先簡單說說我的理解吧,   所謂的介面回撥。 你先將介面定義好,然後在特定的條件下條用它。  可能很多初學者開始的時候很疑惑,其實這也東西你天天都在

OK介面資料型別-泛型

在OK請求完成之後: handler.post(new Runnable() { @Override public void run() { Class<Object> genericUtil = GenericUtil.getGener

Spring生命週期之BeanFactoryPostPorcessor和BeanPostProcessor

BeanFactoryPostProcessor和BeanPostProcessor,這兩個介面,都是Spring初始化bean時對外暴露的擴充套件點。 1、BeanFactoryPostProcessor介面 該介面的定義如下: p

android介面筆記

上圖: 佈局檔案: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/too

在Activity和Service之間使用Binder和介面進行通訊

Activity和Service之間的通訊方式有多種:通過broadcast、擴充套件Binder類、使用Messenger、使用AIDL等。 擴充套件Binder類使用場景 如果你的服務僅供本地應用使用,不需要跨程序工作,則可以實現擴充套件Binder 類,讓你的客戶