Spring的初始化前中后詳細(xì)解讀
Spring 框架是一個(gè)非常流行的 Java 框架,它提供了一種輕量級(jí)的、可擴(kuò)展的方式來(lái)構(gòu)建企業(yè)級(jí)應(yīng)用程序。在 Spring 的生命周期中,有三個(gè)重要的階段,即初始化前、初始化、初始化后。這篇文章將詳細(xì)介紹這些階段,并提供相應(yīng)的源代碼示例和擴(kuò)展點(diǎn)。
初始化前
在 Spring 框架中,初始化前階段是指在創(chuàng)建應(yīng)用程序上下文之前執(zhí)行的階段。在這個(gè)階段, Spring 會(huì)執(zhí)行一些配置和準(zhǔn)備工作,以確保應(yīng)用程序上下文在啟動(dòng)時(shí)能夠正確地初始化。
執(zhí)行步驟
在初始化前階段, Spring 框架會(huì)執(zhí)行以下步驟:
加載 Spring 配置文件
在這個(gè)階段, Spring 會(huì)加載應(yīng)用程序的配置文件。這些配置文件包括 XML 文件、 Java 配置類(lèi)和屬性文件等。
創(chuàng)建BeanFactory
在加載配置文件之后, Spring 會(huì)創(chuàng)建一個(gè)BeanFactory實(shí)例。這個(gè)實(shí)例將會(huì)保存應(yīng)用程序中所有的 bean 定義和 bean 實(shí)例。
預(yù)處理BeanDefinition
在創(chuàng)建BeanFactory之后, Spring 會(huì)預(yù)處理所有的 bean 定義。這個(gè)過(guò)程包括解析所有的 bean 定義,檢查它們的依賴(lài)關(guān)系,并將它們注冊(cè)到BeanFactory中。
執(zhí)行BeanFactoryPostProcessor
在預(yù)處理所有的 bean 定義之后, Spring 會(huì)執(zhí)行所有注冊(cè)的BeanFactoryPostProcessor。這些處理器允許開(kāi)發(fā)人員在BeanFactory創(chuàng)建之前修改 bean 定義。
擴(kuò)展點(diǎn)
在初始化前階段, Spring 提供了以下擴(kuò)展點(diǎn):
BeanFactoryPostProcessor
BeanFactoryPostProcessor 接口允許開(kāi)發(fā)人員在 BeanFactory 創(chuàng)建之前修改 bean 定義。這個(gè)接口有一個(gè)方法 postProcessBeanFactory,開(kāi)發(fā)人員可以在這個(gè)方法中訪問(wèn)并修改BeanFactory。
以下是一個(gè)示例:
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// 在這里修改bean定義
}
}可以在 Spring 的配置文件中注冊(cè)這個(gè)處理器:
<bean class="com.example.MyBeanFactoryPostProcessor"/>
初始化
初始化階段是指在創(chuàng)建應(yīng)用程序上下文時(shí)執(zhí)行的階段。在這個(gè)階段,Spring 會(huì)將配置文件中定義的所有 bean 都實(shí)例化并注入到它們所依賴(lài)的其他 bean 中。
執(zhí)行步驟
在初始化階段, Spring 框架會(huì)執(zhí)行以下步驟:
實(shí)例化 bean
在這個(gè)階段, Spring 會(huì)使用 bean 定義中的信息創(chuàng)建 bean 實(shí)例。
設(shè)置依賴(lài)關(guān)系
在實(shí)例化 bean 之后, Spring 會(huì)注入 bean 所依賴(lài)的其他 bean 。這個(gè)過(guò)程使用屬性注入、構(gòu)造函數(shù)注入或方法注入等方式完成。
執(zhí)行BeanPostProcessor
在設(shè)置好 bean 的依賴(lài)關(guān)系之后, Spring 會(huì)執(zhí)行所有注冊(cè)的 BeanPostProcessor。這些處理器允許開(kāi)發(fā)人員在 bean 實(shí)例化之后修改 bean 。
執(zhí)行InitializingBean和init-method
在執(zhí)行完所有的BeanPostProcessor之后, Spring 會(huì)執(zhí)行 InitializingBean 接口的 afterPropertiesSet 方法或者配置文件中指定的 init-method 方法。
擴(kuò)展點(diǎn)
在初始化階段, Spring 提供了以下擴(kuò)展點(diǎn):
BeanPostProcessor
BeanPostProcessor 接口允許開(kāi)發(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 的配置文件中注冊(cè)這個(gè)處理器:
<bean class="com.example.MyBeanPostProcessor"/>
InitializingBean 和 init-method
InitializingBean 接口和 init-method 方法都允許開(kāi)發(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 會(huì)執(zhí)行一些清理和收尾工作,以確保應(yīng)用程序上下文在關(guān)閉時(shí)能夠正確地銷(xiāo)毀。
執(zhí)行步驟
在初始化后階段, Spring 框架會(huì)執(zhí)行以下步驟:
執(zhí)行DisposableBean和destroy-method
在所有的 bean 都初始化之后, Spring 會(huì)執(zhí)行DisposableBean接口的destroy方法或者配置文件中指定的destroy-method方法。這些方法允許開(kāi)發(fā)人員在 bean 銷(xiāo)毀之前執(zhí)行一些清理工作。
關(guān)閉BeanFactory
在銷(xiāo)毀所有的 bean 之后,Spring 會(huì)關(guān)閉 BeanFactory。這個(gè)過(guò)程包括釋放所有的資源,關(guān)閉所有的線程等。
擴(kuò)展點(diǎn)
在初始化后階段, Spring 提供了以下擴(kuò)展點(diǎn):
DisposableBean 和 destroy-method
DisposableBean 接口和 destroy-method 方法都允許開(kāi)發(fā)人員在 bean 銷(xiāo)毀之前執(zhí)行一些清理工作。這些方法在所有的 bean 都銷(xiāo)毀之前執(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 會(huì)加載配置文件、創(chuàng)建BeanFactory、預(yù)處理 BeanDefinition并執(zhí)行 BeanFactoryPostProcessor。
在初始化階段, Spring 會(huì)實(shí)例化 bean 、設(shè)置依賴(lài)關(guān)系并執(zhí)行 BeanPostProcessor、InitializingBean 和 init-method。
在初始化后階段, Spring 會(huì)執(zhí)行 DisposableBean 和 destroy-method 并關(guān)閉 BeanFactory。通過(guò)這些擴(kuò)展點(diǎn),開(kāi)發(fā)人員可以在 Spring 框架的生命周期的不同階段執(zhí)行一些定制化的操作,以滿(mǎn)足不同的業(yè)務(wù)需求。
到此這篇關(guān)于Spring的初始化前中后詳細(xì)解讀的文章就介紹到這了,更多相關(guān)Spring初始化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot自動(dòng)初始化數(shù)據(jù)庫(kù)的方法分享
- Springboot初始化啟動(dòng)報(bào)錯(cuò)Error?creating?bean?with?name?'dataSource'?defined?in?class?path?resource
- 深入解析Spring Bean初始化時(shí)和銷(xiāo)毀時(shí)的擴(kuò)展點(diǎn)
- 關(guān)于spring的@Bean注解放入引用Bean中初始化失敗分析
- SpringBoot初始化接口CommandLineRunner示例詳解
- SpringBoot整合Flyway實(shí)現(xiàn)數(shù)據(jù)庫(kù)的初始化和版本管理操作
相關(guān)文章
MyBatis-Plus執(zhí)行SQL分析打印過(guò)程
這篇文章主要介紹了MyBatis-Plus執(zhí)行SQL分析打印過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
Mybatis遷移到Mybatis-Plus的實(shí)現(xiàn)方法
這篇文章主要介紹了Mybatis遷移到Mybatis-Plus的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Java?Map循環(huán)遍歷的7種方式與性能對(duì)比
這篇文章主要為大家詳細(xì)介紹了Java中Map的七種遍歷方式,包括entrySet+for-each,keySet+for-each,只遍歷value,Iterator+entrySet等,文內(nèi)分析了每種方式的優(yōu)缺點(diǎn)和適用場(chǎng)景,希望的可以了解下2026-05-05
關(guān)于RestTemplate中的Get請(qǐng)求
這篇文章主要介紹了關(guān)于RestTemplate中的Get請(qǐng)求,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
使用SpringBoot項(xiàng)目導(dǎo)入openfeign版本的問(wèn)題
這篇文章主要介紹了使用SpringBoot項(xiàng)目導(dǎo)入openfeign版本的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03

