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