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 上下文銷毀時則會呼叫自定義的銷毀方法以及實現了disposablebean
的destroy()
方法。 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...