1. 程式人生 > >InitializingBean,DisposableBean ,PostConstruct,PreDestroy作用與執行順序

InitializingBean,DisposableBean ,PostConstruct,PreDestroy作用與執行順序

package com.springmvc.entity;

import org.hibernate.validator.constraints.Length;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.validation.constraints.NotNull;
import java.io.Serializable;

/**
 * 使用者實體類.
 */
public class User implements Serializable, InitializingBean, DisposableBean {
    private static final long serialVersionUID = 1L;
    public User() {
        System.out.println("Use構造方法");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean afterPropertiesSet");
    }

    public void initBean() {
        System.out.println("User initBean");
    }


    @Override
    public void destroy() throws Exception {
        System.out.println("DisposableBean destroy");
    }

    public void destroyBean() {
        System.out.println("User destroyBean");
    }


    /**
     * 構造方法執行之後,呼叫此方法
     */
    @PostConstruct
    public void postConstruct(){
        System.out.println("PostConstruct方法被呼叫");
    }

    /**
     * destroy方法執行之前,呼叫此方法
     */
    @PreDestroy
    public void preDestroy(){
        System.out.println("PreDestroy方法被呼叫");
    }

}
    <!-- 使用註解,不然註解無效-->
    <context:annotation-config/>

    <bean id="user" class="com.springmvc.entity.User" init-method="initBean" destroy-method="destroyBean" >
    </bean>
package com.springmvc.test;

import com.springmvc.entity.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new FileSystemXmlApplicationContext("/src/main/resources/spring-beans.xml");
        ((FileSystemXmlApplicationContext) context).destroy();
    }

}

結果如下(從上往下依次為輸出順序):

Use構造方法
PostConstruct方法被呼叫
InitializingBean afterPropertiesSet
User initBean

PreDestroy方法被呼叫
DisposableBean destroy
User destroyBean

所以執行順序如下:
初始化時:構造器Construct  ->  屬性注入  ->  @PostConstruct  ->  InitializingBean介面  ->  bean定義的initMethod 

銷燬時:@PreDestroy  ->  DisposableBean介面 ->  bean定義的destoryMethod

【@PostConstruct註解後的方法在BeanPostProcessor前置處理器中就被執行了,所以當然要先於InitializingBean和init-method執行了。

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

https://blog.csdn.net/chendaoqiu/article/details/50700246】

如果換成:

package com.springmvc.test;

import com.springmvc.entity.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        ApplicationContext context = new FileSystemXmlApplicationContext("/src/main/resources/spring-beans.xml");
        ((FileSystemXmlApplicationContext) context).destroy();
        User user = new User();
    }

}

輸出結果:後面再追加一條輸出“Use構造方法”

如果換成:

package com.springmvc.test;

import com.springmvc.entity.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
//        ApplicationContext context = new FileSystemXmlApplicationContext("/src/main/resources/spring-beans.xml");
//        ((FileSystemXmlApplicationContext) context).destroy();
        User user = new User(); 
    }

}

輸出結果:只有一條輸出“Use構造方法”,此時為啥InitializingBean, DisposableBean,PostConstruct,PreDestroy不起作用了 ??

參考:

http://zk-chs.iteye.com/blog/2272265

https://blog.csdn.net/wo541075754/article/details/52174900

https://blog.csdn.net/u010002184/article/details/80550228

相關推薦

InitializingBeanDisposableBean PostConstructPreDestroy作用執行順序

package com.springmvc.entity; import org.hibernate.validator.constraints.Length; import org.springframework.beans.factory.DisposableBean;

淺析java中靜態方法非靜態方法和構造方法的執行順序問題

https://blog.csdn.net/qq_42401622/article/details/81190406 對於java中的靜態方法,非靜態方法和構造方法的理解: 靜態方法是隨著的java中虛擬機器的類的載入而載入,是跟隨繫結在一起的。 public class Main{ s

SpringIOC容器初始化之後和銷燬之前幾種方法的執行順序

1.搭建一個簡單的Spring環境 2.定義一個介面及其實現類 package com.roger.service; public interface SpringLifeCycleService { void springLifeCycle(); } package co

Java中靜態、非靜態程式碼塊 無參、有參構造方法執行順序

基本概念 1、靜態程式碼塊和非靜態程式碼塊: 相同點:都是JVM載入類時且在建構函式執行之前執行,在類中都可以定義多個,一般在程式碼塊中對一些static變數進行賦值。 不同點:靜態程式碼塊在非靜態程式碼塊之前執行。靜態程式碼塊只在第一次new時執行一次

測試框架Unitest的執行原理以及多個測試類中的執行順序以及簡化方法

單元測試單元測試(unit testing)是指對軟體中的最小可測試單元進行檢查和驗證。對於單元測試中單元的含義,一般來說,要根據實際情況去判定其具體含義,如C語言中單元指一個函式,Java裡單元指一個類,圖形化的軟體中可以指一個視窗或一個選單等。總的來說,單元就是人為規定的

Jmeter學習筆記2-原件作用執行順序

校驗 height sse proc tro 有效 收集 技術分享 控制 1.元件的作用域 (1)配置元件(config elements):會影響其作用範圍內的所有元件。 (2)前置處理程序(per-processors):在其作用範圍內的每一個sampler元件之

【轉】JMeter學習(三)元件的作用執行順序

ces ner 處理器 規則 fig 子節點 控制器 conf 節點 1.元件的作用域 JMeter中共有8類可被執行的元件(測試計劃與線程組不屬於元件),這些元件中,取樣器是典型的不與其它元件發生交互作用的元件,邏輯控制器只對其子節點的取樣器有效,而其它元件(config

cookiesession的作用執行方式

cookie與session的作用與執行方式問題:瀏覽器與服務器請求與返回過程中,cookie跟session有什麽用?1.cookie# 服務器端產生cookie,cookie是存在瀏覽器中; # 瀏覽器在請求服務器端之後,服務器端想在瀏覽器端保存一些數據; # 服務器就會創建一個cookie,在返回請求相

JMeter學習(三)元件的作用執行順序

1.元件的作用域 JMeter中共有8類可被執行的元件(測試計劃與執行緒組不屬於元件),這些元件中,取樣器是典型的不與其它元件發生互動作用的元件,邏輯控制器只對其子節點的取樣器有效,而其它元件(config elements 、timers 、post-proces

jmeter(六)元件的作用執行順序

jmeter是一個開源的效能測試工具,它可以通過滑鼠拖拽來隨意改變元件之間的順序以及元件的父子關係,那麼隨著它們的順序和所在的域不同,它們在執行的時候,也會有很多不同。 jmeter的test plan通過圖形化的方式表達指令碼,域程式碼方式的指令碼不同,圖形方式表達的指令

【蟲師--系列】JMeter基礎之--元件的作用執行順序

來自: http://www.cnblogs.com/fnng/archive/2012/12/27/2836506.html    作者:蟲師 前面有介紹過jmeter的元件類別,對於新手來說,jmeter的元件是還是不少的,如果我們按照每一個元件的每一個引數的含義去

Spring AOP註解通過@Autowired@Resource@Qualifier@PostConstruct@PreDestroy注入屬性的

本文介紹了使用spring註解注入屬性的方法。 使用註解以前,注入屬性通過類以及配置檔案來實現。現在,注入屬性可以通過引入@Autowired註解,或者@Resource,@Qualifier,@PostConstruct,@PreDestroy等註解來實現。 使用註解以前我們是怎樣注入屬性的 類的實現

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

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

【Spring註解驅動開發】使用InitializingBeanDisposableBean來管理bean的生命週期你真的瞭解嗎?

## 寫在前面 > 在《[【Spring註解驅動開發】如何使用@Bean註解指定初始化和銷燬的方法?看這一篇就夠了!!](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247484985&idx=1&sn=bf7e

SpringBoot學習遇到的問題(1) - 配置文件有日誌的debug模式等配置項為什麽不起作用

boot lease bug fig spa stack 不起作用 網站 cat 這個問題困擾我近乎兩天,通過查找N多資料後終於解決,寫下來共享給大家。 logging.level.root=DEBUG ... 一系列的日誌配置項,都不起作用的原因是springboot啟動

Linux下PHP的SESSION不起作用的問題

lin mod data article trac ack tracking track rac 改動SESSION目錄的權限就能夠了。 先找到SESSION目錄, 然後 chmod -R 777 /var/lib/php/session 假設沒有此目錄

DOS當中的基本操作命令如何切換磁盤如何查看文件和文件夾如何清屏進入文件夾的命令javac是什麽意思作用是什麽?DOS如何建文件夾?退出文件夾?

ava mpi dos compile 通配符 pil jdk 使用 onf 如何切換磁盤:使用盤符+:舉例 d: 如何查看文件和文件夾 dir/w 如何清屏: cls (clear screen) 進入文件夾的命令cd ,舉例cd JDK javac是什麽意思,c 是co

總結javascript基礎概念系列計劃分為三個部分:作用事件循環原型鏈。

嚴格模式 增加 throw 相互 語法錯誤 第一個 scope val 分析 主要問題: 1、javaScript代碼的編譯和執行過程,詞法作用域規則?2、this的動態綁定方式有幾種?3、全局和函數之外是不是還有其他的作用域?4、為什麽代碼規範多禁止with、eval?

JSP的九大內置對象七大動作指令四個作用三個編譯指令

std 根據 頁面 jsp getpara 好的 post .get pos JSP本質是Servlet, Servlet 可以理解為 Serve + Applet的結合。JSP可以在標準的HTML頁面中插入java代碼,從而能更好的控制HTML,通過在本地部署了服務器之後

什麽是作用域鏈什麽是原型鏈它們的區別在js中它們具體指什麽?

function fun 創建 原型鏈 變量 pro pos bject prototype 作用域是針對變量的,比如我們創建了一個函數,函數裏面又包含了一個函數,那麽現在就有三個作用域   全局作用域==>函數1作用域==>函數2作用域 作用域的特點就是,先在