Spring容器擴(kuò)展機(jī)制的實(shí)現(xiàn)原理
IoC 容器負(fù)責(zé)管理容器中所有 bean 的生命周期, 而在 bean 生命周期的不同階段, Spring 提供了不同的擴(kuò)展點(diǎn)來改變 bean 的命運(yùn). 在容器的啟動(dòng)階段, BeanFactoryPostProcessor
允許我們在容器實(shí)例化相應(yīng)對象之前, 對注冊到容器的 BeanDefinition
所保存的信息做一些額外的操作, 比如修改 bean 定義的某些屬性或者增加其他信息等.
BeanPostProcessor 接口
如果希望在Spring容器完成實(shí)例化、配置和初始化bean之后實(shí)現(xiàn)某些自定義邏輯, 則可以實(shí)現(xiàn)一個(gè)或多個(gè) BeanPostProcessor
接口.
public interface BeanPostProcessor { @Nullable default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } @Nullable default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } }
在 Bean 實(shí)例化之后會(huì)先執(zhí)行 postProcessBeforeInitialization
方法, 再執(zhí)行 Bean 的初始化方法, 然后在執(zhí)行 postProcessAfterInitialization
方法.
Ordered 接口 @Order 注解
此接口只有一個(gè)方法 int getOrder();
用來設(shè)置執(zhí)行順序.
如果實(shí)現(xiàn)多個(gè) BeanPostProcessor
接口, 我們就可以實(shí)現(xiàn) Ordered
接口來設(shè)置執(zhí)行順序.
@Component public class Test implements BeanPostProcessor, Ordered { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } @Override public int getOrder() { return 1; } }
也可以使用 @Order
注解進(jìn)行排序
@Configuration @Order(2) public class Demo1Config { @Bean public Demo1Service demo1Service(){ System.out.println("demo1config 加載了"); return new Demo1Service(); } }
BeanFactoryPostProcessor 接口
在容器實(shí)例化相應(yīng)對象之前, 對注冊到容器的 BeanDefinition
所保存的信息做一些額外的操作可以實(shí)現(xiàn)此接口.
區(qū)別
- BeanFactoryPostProcessor 會(huì)處理一些元數(shù)據(jù).
- BeanPostProcessor 會(huì)處理實(shí)例化后的對象.
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
mybatis模糊查詢之bind標(biāo)簽和concat函數(shù)用法詳解
大家都知道bind 標(biāo)簽可以使用 OGNL 表達(dá)式創(chuàng)建一個(gè)變量井將其綁定到上下文中,接下來通過本文給大家介紹了mybatis模糊查詢——bind標(biāo)簽和concat函數(shù)用法,需要的朋友可以參考下2022-08-08去掉 IDEA 中 mybatis配置文件的局部背景顏色(圖解)
這篇文章通過圖文并茂的形式給大家介紹了去掉IntelliJ IDEA 中 mybatis配置文件的局部背景顏色及mybatis 對應(yīng)的 xml 文件警告的方法圖解,需要的朋友可以參考下2018-09-09使用springmvc參數(shù)接收boolean類型參數(shù)的問題
這篇文章主要介紹了使用springmvc參數(shù)接收boolean類型參數(shù)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01SpringSecurity實(shí)現(xiàn)動(dòng)態(tài)加載權(quán)限信息的方法
這篇文章主要介紹了SpringSecurity實(shí)現(xiàn)動(dòng)態(tài)加載權(quán)限信息,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定需要的朋友可以參考下2022-01-01springboot項(xiàng)目啟動(dòng)慢的問題排查方式
這篇文章主要介紹了springboot項(xiàng)目啟動(dòng)慢的問題排查方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09詳解Spring MVC攔截器實(shí)現(xiàn)session控制
這篇文章主要介紹了詳解Spring MVC攔截器實(shí)現(xiàn)session控制,使用session監(jiān)聽,重復(fù)登錄后,強(qiáng)制之前登錄的session過期。有興趣的可以了解一下。2017-01-01AbstractQueuedSynchronizer內(nèi)部類Node使用講解
這篇文章主要為大家介紹了AbstractQueuedSynchronizer內(nèi)部類Node使用講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07