Spring擴(kuò)展點(diǎn)之BeanFactoryPostProcessor詳解
BeanFactoryPostProcessor
即:BeanFactory后置處理器,是實(shí)現(xiàn)Spring容器功能擴(kuò)展的又一重要接口。它是對(duì) BeanDefinition對(duì)象進(jìn)行屬性相關(guān)的修改。
例如:修改bean屬性值,實(shí)現(xiàn)bean動(dòng)態(tài)代理等。很多框架都是通過此接口實(shí)現(xiàn)對(duì)spring容器的擴(kuò)展,例如mybatis與spring集成時(shí),只定義了mapper接口,無實(shí)現(xiàn)類,但spring卻可以完成自動(dòng)注入,是不是很神奇? 本文將通過簡單的例子,展現(xiàn)BeanFactoryPostProcessor的擴(kuò)展能力。
說明:BeanDefinition對(duì)象,即:Bean定義對(duì)象,里面存儲(chǔ)著Bean標(biāo)簽的所有信息,Spring就是通過BeanDefintion對(duì)象來生成最終的Bean實(shí)例。
執(zhí)行時(shí)機(jī)
所有的bean定義信息,已經(jīng)被加載到IOC容器中,bean實(shí)例還沒有被初始化時(shí),BeanFactoryPostProcessor被調(diào)用。
即:在bean定義已解決被加載到IOC容器中,還沒有初始化之前,我們可以悄悄的往容器中添加一些東西,進(jìn)行一些小動(dòng)作的修改。
使用
/** * TODO 自定義BeanFactoryPostProcessor * 執(zhí)行時(shí)間:所有的Bean定義信息已經(jīng)加載到容器中,但是Bean實(shí)例還沒有被初始化. * * @author : lzb * @date: 2021-03-15 17:42 */ public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { System.out.println("IOC 容器調(diào)用了MyBeanFactoryPostProcessor中重寫的postProcessBeanFactory方法"); for(String name:beanFactory.getBeanDefinitionNames()) { if("person".equals(name)) { System.out.println("將Person對(duì)象設(shè)置為懶加載"); BeanDefinition beanDefinition = beanFactory.getBeanDefinition(name); beanDefinition.setLazyInit(true); } } } }
使其生效,有如下兩種方式:
方式一
使用@Configuration + @Bean 方式初始化
/** * 定義一個(gè)主配置類,標(biāo)識(shí)為@Configuration,通過@Bean方式初始化,注入IOC容器 */ @Configuration public class MainConfig { @Bean public MyBeanFactoryPostProcessor myBeanFactoryPostProcessor () { return new MyBeanFactoryPostProcessor(); } }
方式二
使用@ComponentScan + @Component方式初始化
/** * 使用@ComponentScan定義組件掃描包范圍,在可掃描的保范圍內(nèi), * 然后使用@Component方式,將其定義為一個(gè)組件初始化,注入IOC容器 */ @Component public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { System.out.println("IOC 容器調(diào)用了MyBeanFactoryPostProcessor中重寫的postProcessBeanFactory方法"); // 獲取Bean定義名稱,進(jìn)行遍歷 for(String name:beanFactory.getBeanDefinitionNames()) { // 如果是person對(duì)象 if("person".equals(name)) { System.out.println("將Person對(duì)象設(shè)置為懶加載"); // 獲取person的BeanDefinition(Bean定義對(duì)象) BeanDefinition beanDefinition = beanFactory.getBeanDefinition(name); // 將Person對(duì)象設(shè)置為懶加載 beanDefinition.setLazyInit(true); } } } }
執(zhí)行結(jié)果
到此這篇關(guān)于Spring擴(kuò)展點(diǎn)之BeanFactoryPostProcessor詳解的文章就介紹到這了,更多相關(guān)BeanFactoryPostProcessor詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
jmeter中json提取器如何提取多個(gè)參數(shù)值
關(guān)于jmeter中的正則表達(dá)式及json提取器可以提取響應(yīng)值,但是實(shí)際可以需要上個(gè)接口的多個(gè)響應(yīng)值,本文就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下2021-11-11SpringBoot瘦身打包部署的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot瘦身打包部署的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Java數(shù)據(jù)結(jié)構(gòu)之AC自動(dòng)機(jī)算法的實(shí)現(xiàn)
AC自動(dòng)機(jī)算法常被認(rèn)為是Trie樹+KMP算法的結(jié)合體,它是一個(gè)多模式匹配算法,在模式匹配領(lǐng)域被廣泛應(yīng)用。本文將詳細(xì)為大家介紹AC自動(dòng)機(jī)的原理與實(shí)現(xiàn)方法,感興趣的可以了解一下2022-12-12Springboot死信隊(duì)列?DLX?配置和使用思路分析
死信隊(duì)列簡稱就是DLX,死信交換機(jī)和死信隊(duì)列和普通的沒有區(qū)別,當(dāng)消息成為死信后,如果該隊(duì)列綁定了死信交換機(jī),則消息會(huì)被死信交換機(jī)重新路由到死信隊(duì)列,本文給大家介紹Springboot死信隊(duì)列?DLX的相關(guān)知識(shí),感興趣的朋友一起看看吧2022-03-03