Spring的初始化前中后詳細(xì)解讀
Spring 框架是一個(gè)非常流行的 Java 框架,它提供了一種輕量級的、可擴(kuò)展的方式來構(gòu)建企業(yè)級應(yīng)用程序。在 Spring 的生命周期中,有三個(gè)重要的階段,即初始化前、初始化、初始化后。這篇文章將詳細(xì)介紹這些階段,并提供相應(yīng)的源代碼示例和擴(kuò)展點(diǎn)。
初始化前
在 Spring 框架中,初始化前階段是指在創(chuàng)建應(yīng)用程序上下文之前執(zhí)行的階段。在這個(gè)階段, Spring 會執(zhí)行一些配置和準(zhǔn)備工作,以確保應(yīng)用程序上下文在啟動時(shí)能夠正確地初始化。
執(zhí)行步驟
在初始化前階段, Spring 框架會執(zhí)行以下步驟:
加載 Spring 配置文件
在這個(gè)階段, Spring 會加載應(yīng)用程序的配置文件。這些配置文件包括 XML 文件、 Java 配置類和屬性文件等。
創(chuàng)建BeanFactory
在加載配置文件之后, Spring 會創(chuàng)建一個(gè)BeanFactory實(shí)例。這個(gè)實(shí)例將會保存應(yīng)用程序中所有的 bean 定義和 bean 實(shí)例。
預(yù)處理BeanDefinition
在創(chuàng)建BeanFactory之后, Spring 會預(yù)處理所有的 bean 定義。這個(gè)過程包括解析所有的 bean 定義,檢查它們的依賴關(guān)系,并將它們注冊到BeanFactory中。
執(zhí)行BeanFactoryPostProcessor
在預(yù)處理所有的 bean 定義之后, Spring 會執(zhí)行所有注冊的BeanFactoryPostProcessor。這些處理器允許開發(fā)人員在BeanFactory創(chuàng)建之前修改 bean 定義。
擴(kuò)展點(diǎn)
在初始化前階段, Spring 提供了以下擴(kuò)展點(diǎn):
BeanFactoryPostProcessor
BeanFactoryPostProcessor 接口允許開發(fā)人員在 BeanFactory 創(chuàng)建之前修改 bean 定義。這個(gè)接口有一個(gè)方法 postProcessBeanFactory,開發(fā)人員可以在這個(gè)方法中訪問并修改BeanFactory。
以下是一個(gè)示例:
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor { public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { // 在這里修改bean定義 } }
可以在 Spring 的配置文件中注冊這個(gè)處理器:
<bean class="com.example.MyBeanFactoryPostProcessor"/>
初始化
初始化階段是指在創(chuàng)建應(yīng)用程序上下文時(shí)執(zhí)行的階段。在這個(gè)階段,Spring 會將配置文件中定義的所有 bean 都實(shí)例化并注入到它們所依賴的其他 bean 中。
執(zhí)行步驟
在初始化階段, Spring 框架會執(zhí)行以下步驟:
實(shí)例化 bean
在這個(gè)階段, Spring 會使用 bean 定義中的信息創(chuàng)建 bean 實(shí)例。
設(shè)置依賴關(guān)系
在實(shí)例化 bean 之后, Spring 會注入 bean 所依賴的其他 bean 。這個(gè)過程使用屬性注入、構(gòu)造函數(shù)注入或方法注入等方式完成。
執(zhí)行BeanPostProcessor
在設(shè)置好 bean 的依賴關(guān)系之后, Spring 會執(zhí)行所有注冊的 BeanPostProcessor。這些處理器允許開發(fā)人員在 bean 實(shí)例化之后修改 bean 。
執(zhí)行InitializingBean和init-method
在執(zhí)行完所有的BeanPostProcessor之后, Spring 會執(zhí)行 InitializingBean 接口的 afterPropertiesSet 方法或者配置文件中指定的 init-method 方法。
擴(kuò)展點(diǎn)
在初始化階段, Spring 提供了以下擴(kuò)展點(diǎn):
BeanPostProcessor
BeanPostProcessor 接口允許開發(fā)人員在 bean 實(shí)例化之后修改 bean 。這個(gè)接口有兩個(gè)方法 postProcessBeforeInitialization 和 postProcessAfterInitialization,分別表示在 bean 初始化前和初始化后執(zhí)行。
以下是一個(gè)示例:
public class MyBeanPostProcessor implements BeanPostProcessor { public Object postProcessBeforeInitialization(Object bean, String beanName) { // 在這里修改bean return bean; } public Object postProcessAfterInitialization(Object bean, String beanName) { // 在這里修改bean return bean; } }
可以在 Spring 的配置文件中注冊這個(gè)處理器:
<bean class="com.example.MyBeanPostProcessor"/>
InitializingBean 和 init-method
InitializingBean 接口和 init-method 方法都允許開發(fā)人員在 bean 實(shí)例化之后執(zhí)行一些初始化工作。這些方法在 bean 實(shí)例化之后執(zhí)行,但在BeanPostProcessor之前執(zhí)行。
以下是一個(gè)示例:
public class MyBean implements InitializingBean { public void afterPropertiesSet() throws Exception { // 在這里執(zhí)行初始化工作 } }
可以在 Spring 的配置文件中使用init-method定義這個(gè)初始化方法:
<bean id="myBean" class="com.example.MyBean" init-method="init"/>
初始化后
初始化后階段是指在所有 bean 都初始化之后執(zhí)行的階段。在這個(gè)階段,Spring 會執(zhí)行一些清理和收尾工作,以確保應(yīng)用程序上下文在關(guān)閉時(shí)能夠正確地銷毀。
執(zhí)行步驟
在初始化后階段, Spring 框架會執(zhí)行以下步驟:
執(zhí)行DisposableBean和destroy-method
在所有的 bean 都初始化之后, Spring 會執(zhí)行DisposableBean接口的destroy方法或者配置文件中指定的destroy-method方法。這些方法允許開發(fā)人員在 bean 銷毀之前執(zhí)行一些清理工作。
關(guān)閉BeanFactory
在銷毀所有的 bean 之后,Spring 會關(guān)閉 BeanFactory。這個(gè)過程包括釋放所有的資源,關(guān)閉所有的線程等。
擴(kuò)展點(diǎn)
在初始化后階段, Spring 提供了以下擴(kuò)展點(diǎn):
DisposableBean 和 destroy-method
DisposableBean 接口和 destroy-method 方法都允許開發(fā)人員在 bean 銷毀之前執(zhí)行一些清理工作。這些方法在所有的 bean 都銷毀之前執(zhí)行。
以下是一個(gè)示例:
public class MyBean implements DisposableBean { public void destroy() throws Exception { // 在這里執(zhí)行清理工作 } }
可以在 Spring 的配置文件中使用destroy-method定義這個(gè)清理方法:
<bean id="myBean" class="com.example.MyBean" destroy-method="destroy"/>
結(jié)論
Spring 框架的生命周期包括初始化前、初始化、初始化后三個(gè)階段。
在初始化前階段, Spring 會加載配置文件、創(chuàng)建BeanFactory、預(yù)處理 BeanDefinition并執(zhí)行 BeanFactoryPostProcessor。
在初始化階段, Spring 會實(shí)例化 bean 、設(shè)置依賴關(guān)系并執(zhí)行 BeanPostProcessor、InitializingBean 和 init-method。
在初始化后階段, Spring 會執(zhí)行 DisposableBean 和 destroy-method 并關(guān)閉 BeanFactory。通過這些擴(kuò)展點(diǎn),開發(fā)人員可以在 Spring 框架的生命周期的不同階段執(zhí)行一些定制化的操作,以滿足不同的業(yè)務(wù)需求。
到此這篇關(guān)于Spring的初始化前中后詳細(xì)解讀的文章就介紹到這了,更多相關(guān)Spring初始化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot自動初始化數(shù)據(jù)庫的方法分享
- Springboot初始化啟動報(bào)錯(cuò)Error?creating?bean?with?name?'dataSource'?defined?in?class?path?resource
- 深入解析Spring Bean初始化時(shí)和銷毀時(shí)的擴(kuò)展點(diǎn)
- 關(guān)于spring的@Bean注解放入引用Bean中初始化失敗分析
- SpringBoot初始化接口CommandLineRunner示例詳解
- SpringBoot整合Flyway實(shí)現(xiàn)數(shù)據(jù)庫的初始化和版本管理操作
相關(guān)文章
解決idea2020.2遇到pom.xml文件報(bào)錯(cuò)maven插件tomcat7的問題
這篇文章主要介紹了idea2020.2遇到pom.xml文件報(bào)錯(cuò)maven插件tomcat7的問題,本文給大家分享解決方法,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09為什么禁止在SpringBoot項(xiàng)目中使用@Autowired注解
寫代碼的時(shí)候突然發(fā)現(xiàn)?idea?在屬性注入的?@Autowired?注解上給出警告提示,spring?framework?4.0?以后開始出現(xiàn)的,spring?4.0?開始就不推薦使用屬性注入,改為推薦構(gòu)造器注入和?setter?注入,推薦的方法是使用基于構(gòu)造函數(shù)和基于setter的依賴注入2024-08-08SpringBoot + JPA @ManyToMany的操作要點(diǎn)說明
這篇文章主要介紹了SpringBoot + JPA @ManyToMany的操作要點(diǎn)說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12一文搞懂MyBatis多數(shù)據(jù)源Starter實(shí)現(xiàn)
本文將實(shí)現(xiàn)一個(gè)MyBatis的Springboot的Starter包,引用這個(gè)Starter包后,僅需要提供少量配置信息,就能夠完成MyBatis多數(shù)據(jù)源的初始化和使用,需要的小伙伴可以參考一下2023-04-04Java實(shí)現(xiàn)操作JSON的便捷工具類完整實(shí)例【重寫Google的Gson】
這篇文章主要介紹了Java實(shí)現(xiàn)操作JSON的便捷工具類,基于重寫Google的Gson實(shí)現(xiàn),涉及java針對json數(shù)據(jù)的各種常見轉(zhuǎn)換操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-10-10