Spring Boot 生命週期管理

轉自https://www.jianshu.com/p/8e2d400492c7

 

Bean的生命週期過程描述

我們先看一下Bean的生命週期過程中都會經歷些什麼,我先簡單解釋一下,後面我們通過源碼進行詳細解釋。首先Spring在實例化Bean的時候,會先調用它的構造函數,進行Bean的實例化,然後進行Bean的初始化,Bean的初始化經過三個階段初始化之前(applyBeanPostProcessorsBeforeInitialization),其次是進行初始化(invokeInitMethods),最後是初始化之後(postProcessAfterInitialization),這就是Bean的初始化過程;然後就開始利用Bean進行業務邏輯處理,最後容器正常關閉,Spring開始銷燬Bean,Bean的銷燬過程相對比較簡單,調用DisposableBeanAdapter.destroy()方法,該方法中有三個地方比較重要,分別觸發Bean的生命週期方法,它們是:processor.postProcessBeforeDestruction(this.bean, this.beanName);
((DisposableBean) bean).destroy();
invokeCustomDestroyMethod(this.destroyMethod);

下面我把用圖片來進行直觀展示:

實例運行

User類,這裏就是普通的一個Bean,用來添加到容器中,觀察其生命週期

package com.itbofeng.bean;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class User implements InitializingBean , DisposableBean {
    private String name;
    public User() {
        System.out.println("調用Bean的函數(constructor)");
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        System.out.println("調用Bean的函數(setName/setAttribute)");
        this.name = name;
    }
    @PostConstruct
    public void postConstruct(){
        System.out.println("調用Bean的函數(postConstruct)");
    }
    //MainConfig中@Bean 的initMethod
    public void initMethod(){
        System.out.println("調用Bean的函數(initMethod)");
    }
    //InitializingBean接口的方法afterPropertiesSet
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("調用Bean的函數(afterPropertiesSet)");
    }
    @PreDestroy
    public void preDestroy(){
        System.out.println("調用Bean的函數(preDestroy)");
    }
    //DisposableBean接口的方法destroy
    @Override
    public void destroy() throws Exception {
        System.out.println("調用Bean的函數(destroy)");
    }
    //MainConfig中@Bean 的destroyMethod
    public void destroyMethod(){
        System.out.println("調用Bean的函數(destroyMethod)");
    }
}

CustomBeanPostProcessor類,用來觀察BeanPostProcessor的運行時期

package com.itbofeng.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
    @Nullable
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if(bean.getClass()==User.class){
            System.out.println("調用postProcessBeforeInitialization...");
        }
        return bean;
    }
    @Nullable
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if(bean.getClass()==User.class){
            System.out.println("調用postProcessAfterInitialization...");
        }
        return bean;
    }
}

MainConfig類,SpringBoot程序運行的主類,並將User和CustomBeanPostProcessor 加入到容器中

package com.itbofeng;
import com.itbofeng.bean.User;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class MainConfig {
    public static void main(String[] args) {
        SpringApplication.run(MainConfig.class,args);
    }
    @Bean(initMethod = "initMethod",destroyMethod = "destroyMethod")
    public User user(){
        return new User();
    }
}

運行結果

發佈了86 篇原創文章 · 獲贊 25 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章