Spring Bean 生命週期

2021-10-22 07:37:15 字數 3518 閱讀 9814

spring bean 的生命週期在整個 spring 中占有很重要的位置,掌握這些可以加深對 spring 的理解。

首先看下生命週期圖:

再談生命週期之前有一點需要先明確:

spring 只幫我們管理單例模式 bean 的完整生命週期,對於 prototype 的 bean ,spring 在建立好交給使用者之後則不會再管理後續的生命週期。

在 bean 初始化時會經歷幾個階段,首先可以使用註解@postconstruct,@predestroy來在 bean 的建立和銷毀階段進行呼叫:

@component

public class annotationbean

@predestroy

public void destroy()

}

還可以實現initializingbean,disposablebean這兩個介面,也是在初始化以及銷毀階段呼叫:

@service

public class springlifecycleservice implements initializingbean,disposablebean

@override

public void destroy() throws exception

}

也可以自定義方法用於在初始化、銷毀階段呼叫:

@configuration

public class lifecycleconfig

}public class springlifecycle

public void destroy()

}

以上是在 springboot 中可以這樣配置,如果是原始的基於 xml 也是可以使用:

來達到同樣的效果。

*aware介面可以用於在初始化 bean 時獲得 spring 中的一些物件,如獲取spring 上下文等。

@component

private final static logger logger = logge***ctory.getlogger(springlifecycleaware.class);

@override

logger.info("springlifecycleaware start");}}

實現 beanpostprocessor 介面,spring 中所有 bean 在做初始化時都會呼叫該介面中的兩個方法,可以用於對一些特殊的 bean 進行處理:

@component

public class springlifecycleprocessor implements beanpostprocessor ",beanname);

}return bean;

}/**

* 後初始化 bean 初始化完成呼叫

* @param bean

* @param beanname

* @return

* @throws bean***ception

*/@override

public object postprocessafterinitialization(object bean, string beanname) throws bean***ception ",beanname);

}return bean;}}

執行之後觀察結果:

018-03-21 00:40:24.856 [restartedmain] info  c.c.s.p.springlifecycleprocessor - springlifecycleprocessor start beanname=annotationbean

2018-03-21 00:40:24.860 [restartedmain] info c.c.spring.annotation.annotationbean - annotationbean start

2018-03-21 00:40:24.861 [restartedmain] info c.c.s.p.springlifecycleprocessor - springlifecycleprocessor end beanname=annotationbean

2018-03-21 00:40:24.864 [restartedmain] info c.c.s.aware.springlifecycleaware - springlifecycleaware start

2018-03-21 00:40:24.867 [restartedmain] info c.c.s.service.springlifecycleservice - springlifecycleservice start

2018-03-21 00:40:24.887 [restartedmain] info c.c.spring.springlifecycle - springlifecycle start

2018-03-21 00:40:25.062 [restartedmain] info o.s.b.d.a.optionallivereloadserver - livereload server is running on port 35729

2018-03-21 00:40:25.122 [restartedmain] info o.s.j.e.a.annotationmbeanexporter - registering beans for jmx exposure on startup

2018-03-21 00:40:25.155 [thread-8] info o.s.j.e.a.annotationmbeanexporter - unregistering jmx-exposed beans on shutdown

2018-03-21 00:40:25.156 [thread-8] info c.c.spring.springlifecycle - springlifecycle destroy

2018-03-21 00:40:25.156 [thread-8] info c.c.s.service.springlifecycleservice - springlifecycleservice destroy

2018-03-21 00:40:25.156 [thread-8] info c.c.spring.annotation.annotationbean - annotationbean destroy

直到 spring 上下文銷毀時則會呼叫自定義的銷毀方法以及實現了disposablebeandestroy()方法。

Spring Bean生命週期

1.容器尋找bean的定義資訊並且將其實例化。2.受用依賴注入,spring按照bean定義資訊配置bean的所有屬性。3.如果bean實現了beannameaware介面,工廠呼叫bean的setbeanname 方法傳遞bean的id。4.如果bean實現了beanfactoryaware介面,...

spring bean生命週期

生命週期 定義,初始化,使用,銷毀 一.初始化 方法1.實現org.springframework.beans.foctory.initializingbean介面,覆蓋afterpropertiesset方法。系統會自動查詢afterpropertiesset方法,執行其中的初始化操作 方法2.配...

Springbean生命週期

springbean的完整生命週期大致如下 1 首先例項化 beanfactorypostprocessor的實現類,執行它的postprocessorbeanfactory方法 2 例項化beanpostprocessor 的實現類 3 例項化 instantiationawarebeanpost...