Java之SpringBean生命周期問題理解
Spring Bean的生命周期?
首先說一下Servlet的生命周期:實例化,初始init,接收請求service,銷毀destroy;
Spring上下文中的Bean生命周期也類似,如下:
(1)實例化Bean:
對于BeanFactory容器,當客戶向容器請求一個尚未初始化的bean時,或初始化bean的時候需要注入另一個尚未初始化的依賴時,容器就會調(diào)用createBean進行實例化。對于ApplicationContext容器,當容器啟動結束后,通過獲取BeanDefinition對象中的信息,實例化所有的bean。
(2)設置對象屬性(依賴注入):
實例化后的對象被封裝在BeanWrapper對象中,緊接著,Spring根據(jù)BeanDefinition中的信息 以及 通過BeanWrapper提供的設置屬性的接口完成依賴注入。
(3)處理Aware接口:
接著,Spring會檢測該對象是否實現(xiàn)了xxxAware接口,并將相關的xxxAware實例注入給Bean:
①如果這個Bean已經(jīng)實現(xiàn)了BeanNameAware接口,會調(diào)用它實現(xiàn)的setBeanName(String beanId)方法,此處傳遞的就是Spring配置文件中Bean的id值;
②如果這個Bean已經(jīng)實現(xiàn)了BeanFactoryAware接口,會調(diào)用它實現(xiàn)的setBeanFactory()方法,傳遞的是Spring工廠自身。
③如果這個Bean已經(jīng)實現(xiàn)了ApplicationContextAware接口,會調(diào)用setApplicationContext(ApplicationContext)方法,傳入Spring上下文;
(4)BeanPostProcessor:
如果想對Bean進行一些自定義的處理,那么可以讓Bean實現(xiàn)了BeanPostProcessor接口,那將會調(diào)用postProcessBeforeInitialization(Object obj, String s)方法。由于這個方法是在Bean初始化結束時調(diào)用的,所以可以被應用于內(nèi)存或緩存技術;
(5)InitializingBean 與 init-method:
如果Bean在Spring配置文件中配置了 init-method 屬性,則會自動調(diào)用其配置的初始化方法。
(6)如果這個Bean實現(xiàn)了BeanPostProcessor接口,將會調(diào)用postProcessAfterInitialization(Object obj, String s)方法;
以上幾個步驟完成后,Bean就已經(jīng)被正確創(chuàng)建了,之后就可以使用這個Bean了。
(7)DisposableBean:
當Bean不再需要時,會經(jīng)過清理階段,如果Bean實現(xiàn)了DisposableBean這個接口,會調(diào)用其實現(xiàn)的destroy()方法;
(8)destroy-method:
最后,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動調(diào)用其配置的銷毀方法。
到此這篇關于Java之SpringBean生命周期問題理解的文章就介紹到這了,更多相關Java之SpringBean生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring中的攔截器HandlerInterceptor詳細解析
這篇文章主要介紹了Spring中的攔截器HandlerInterceptor詳細解析,HandlerInterceptor 是 Spring 框架提供的一個攔截器接口,用于在請求處理過程中攔截和處理請求,需要的朋友可以參考下2024-01-01Java?synchronized輕量級鎖實現(xiàn)過程淺析
這篇文章主要介紹了Java synchronized輕量級鎖實現(xiàn)過程,synchronized是Java里的一個關鍵字,起到的一個效果是"監(jiān)視器鎖",它的功能就是保證操作的原子性,同時禁止指令重排序和保證內(nèi)存的可見性2023-02-02