使用Spring動(dòng)態(tài)修改bean屬性的key
Spring動(dòng)態(tài)修改bean屬性的key
- BeanDefinitionRegistryPostProcessor - 動(dòng)態(tài)注冊(cè)bean定義
- BeanFactoryPostProcessor - 動(dòng)態(tài)修改bean定義
- BeanPostProcessor - 動(dòng)態(tài)修改bean,即在bean初始化前后做些特殊操作
BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor以及BeanPostProcessor都屬于Spring的后置處理器,可以實(shí)現(xiàn)它們以達(dá)到動(dòng)態(tài)注冊(cè)bean定義,動(dòng)態(tài)修改bean定義,以及動(dòng)態(tài)修改bean。
1、BeanDefinitionRegistryPostProcessor
繼承接口BeanFactoryPostProcessor,該接口新增postProcessBeanDefinitionRegistry方法,方法參數(shù)是BeanDefinitionRegistry對(duì)象,BeanDefinitionRegistry對(duì)象是bean定義的保存中心。
2、BeanFactoryPostProcessor是一個(gè)接口
它允許自定義修改應(yīng)用程序上下文的bean定義,在基于bean factory上調(diào)整上下文的bean屬性值。
BeanFactoryPostProcessor可以與bean交互并修改bean定義,但從不使用bean實(shí)例。
實(shí)現(xiàn)該接口,可以在spring的bean創(chuàng)建之前,修改bean的定義屬性。
也就是說(shuō),Spring允許BeanFactoryPostProcessor在容器實(shí)例化任何其它bean之前讀取配置元數(shù)據(jù),并可以根據(jù)需要進(jìn)行修改,例如可以把bean的scope從singleton改為prototype,也可以把property的值給修改掉。
可以同時(shí)配置多個(gè)BeanFactoryPostProcessor,并通過(guò)設(shè)置’order’屬性來(lái)控制各個(gè)BeanFactoryPostProcessor的執(zhí)行次序。
這里我們想動(dòng)態(tài)修改bean屬性的key,也就是希望修改bean的定義。
所以使用BeanFactoryPostProcessor即可。
- 在application context執(zhí)行完標(biāo)準(zhǔn)初始化之后,所有bean definition都已加載,但還沒(méi)有實(shí)例化任何bean。
- BeanFactoryPostProcessor允許插手修改context內(nèi)部bean工廠,允許覆蓋或添加屬性
3、BeanPostProcessor也是一個(gè)接口
它允許動(dòng)態(tài)修改應(yīng)用程序上下文的bean,這時(shí)候bean已經(jīng)實(shí)例化成功。
BeanPostProcessor,該接口我們也叫后置處理器,作用是在bean對(duì)象的實(shí)例化和依賴注入完畢后,在顯示調(diào)用初始化方法的前后添加我們的邏輯。
這里需要注意的是Bean實(shí)例化完畢以及依賴注入完成后觸發(fā)的
package com.dpb.processor; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; /** * 自定義BeanPostProcessor實(shí)現(xiàn)類 * BeanPostProcessor接口的作用是: * 我們可以通過(guò)該接口中的方法在bean實(shí)例化、配置以及其他初始化方法前后添加一些我們自己的邏輯 * @author dengp * */ public class MyBeanPostProcessor implements BeanPostProcessor{ /** * 實(shí)例化、依賴注入完畢,在調(diào)用顯示的初始化之前完成一些定制的初始化任務(wù) * 注意:方法返回值不能為null * 如果返回null那么在后續(xù)初始化方法將報(bào)空指針異?;蛘咄ㄟ^(guò)getBean()方法獲取不到bena實(shí)例對(duì)象 * 因?yàn)楹笾锰幚砥鲝腟pring IoC容器中取出bean實(shí)例對(duì)象沒(méi)有再次放回IoC容器中 */ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("初始化 before--實(shí)例化的bean對(duì)象:"+bean+"\t"+beanName); // 可以根據(jù)beanName不同執(zhí)行不同的處理操作 return bean; } /** * 實(shí)例化、依賴注入、初始化完畢時(shí)執(zhí)行 * 注意:方法返回值不能為null * 如果返回null那么在后續(xù)初始化方法將報(bào)空指針異常或者通過(guò)getBean()方法獲取不到bena實(shí)例對(duì)象 * 因?yàn)楹笾锰幚砥鲝腟pring IoC容器中取出bean實(shí)例對(duì)象沒(méi)有再次放回IoC容器中 */ @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("初始化 after...實(shí)例化的bean對(duì)象:"+bean+"\t"+beanName); // 可以根據(jù)beanName不同執(zhí)行不同的處理操作 return bean; } }
三者執(zhí)行順序
BeanDefinitionRegistryPostProcessor優(yōu)先于BeanFactoryPostProcessor執(zhí)行,BeanFactoryPostProcessor優(yōu)先于BeanPostProcessor執(zhí)行。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Spring緩存注解@Cacheable,@CachePut , @CacheEvict使用
這篇文章主要介紹了詳解Spring緩存注解@Cacheable,@CachePut , @CacheEvict使用,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-05-05Java中MapStruct對(duì)象映射的實(shí)現(xiàn)
MapStruct是一種Java實(shí)體類映射框架,本文就來(lái)介紹一下Java中MapStruct對(duì)象映射的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-12-12Springmvc調(diào)用存儲(chǔ)過(guò)程,并返回存儲(chǔ)過(guò)程返還的數(shù)據(jù)方式
這篇文章主要介紹了Springmvc調(diào)用存儲(chǔ)過(guò)程,并返回存儲(chǔ)過(guò)程返還的數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Intellij IDEA菜單欄不見(jiàn)了(Main Menu as Separat
有人問(wèn)博主,關(guān)于Intellij IDEA菜單欄找不到了,被不小心的操作給隱藏了,怎么辦?下面給大家分享解決方案,感興趣的朋友跟隨小編一起看看吧2024-06-06Spring AI與DeepSeek實(shí)戰(zhàn)一之快速打造智能對(duì)話應(yīng)用
本文詳細(xì)介紹了如何通過(guò)SpringAI框架集成DeepSeek大模型,實(shí)現(xiàn)普通對(duì)話和流式對(duì)話功能,步驟包括申請(qǐng)API-KEY、項(xiàng)目搭建、配置API-KEY、創(chuàng)建ChatClient對(duì)象、創(chuàng)建對(duì)話接口、切換模型、使用prompt模板、流式對(duì)話等,感興趣的朋友一起看看吧2025-03-03完美解決Spring Boot前端的Access-Control-Allow-Origin跨域問(wèn)題
這篇文章主要介紹了完美解決Spring Boot前端的Access-Control-Allow-Origin跨域問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05Spark使用IDEA編寫(xiě)wordcount的示例演示
這篇文章主要介紹了Spark使用IDEA編寫(xiě)wordcount的示例演示,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07