Spring擴展點之BeanFactoryPostProcessor詳解
BeanFactoryPostProcessor
即:BeanFactory后置處理器,是實現(xiàn)Spring容器功能擴展的又一重要接口。它是對 BeanDefinition對象進行屬性相關(guān)的修改。
例如:修改bean屬性值,實現(xiàn)bean動態(tài)代理等。很多框架都是通過此接口實現(xiàn)對spring容器的擴展,例如mybatis與spring集成時,只定義了mapper接口,無實現(xiàn)類,但spring卻可以完成自動注入,是不是很神奇? 本文將通過簡單的例子,展現(xiàn)BeanFactoryPostProcessor的擴展能力。
說明:BeanDefinition對象,即:Bean定義對象,里面存儲著Bean標(biāo)簽的所有信息,Spring就是通過BeanDefintion對象來生成最終的Bean實例。
執(zhí)行時機
所有的bean定義信息,已經(jīng)被加載到IOC容器中,bean實例還沒有被初始化時,BeanFactoryPostProcessor被調(diào)用。
即:在bean定義已解決被加載到IOC容器中,還沒有初始化之前,我們可以悄悄的往容器中添加一些東西,進行一些小動作的修改。
使用
/** * TODO 自定義BeanFactoryPostProcessor * 執(zhí)行時間:所有的Bean定義信息已經(jīng)加載到容器中,但是Bean實例還沒有被初始化. * * @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對象設(shè)置為懶加載"); BeanDefinition beanDefinition = beanFactory.getBeanDefinition(name); beanDefinition.setLazyInit(true); } } } }
使其生效,有如下兩種方式:
方式一
使用@Configuration + @Bean 方式初始化
/** * 定義一個主配置類,標(biāo)識為@Configuration,通過@Bean方式初始化,注入IOC容器 */ @Configuration public class MainConfig { @Bean public MyBeanFactoryPostProcessor myBeanFactoryPostProcessor () { return new MyBeanFactoryPostProcessor(); } }
方式二
使用@ComponentScan + @Component方式初始化
/** * 使用@ComponentScan定義組件掃描包范圍,在可掃描的保范圍內(nèi), * 然后使用@Component方式,將其定義為一個組件初始化,注入IOC容器 */ @Component public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { System.out.println("IOC 容器調(diào)用了MyBeanFactoryPostProcessor中重寫的postProcessBeanFactory方法"); // 獲取Bean定義名稱,進行遍歷 for(String name:beanFactory.getBeanDefinitionNames()) { // 如果是person對象 if("person".equals(name)) { System.out.println("將Person對象設(shè)置為懶加載"); // 獲取person的BeanDefinition(Bean定義對象) BeanDefinition beanDefinition = beanFactory.getBeanDefinition(name); // 將Person對象設(shè)置為懶加載 beanDefinition.setLazyInit(true); } } } }
執(zhí)行結(jié)果
到此這篇關(guān)于Spring擴展點之BeanFactoryPostProcessor詳解的文章就介紹到這了,更多相關(guān)BeanFactoryPostProcessor詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章

Java數(shù)據(jù)結(jié)構(gòu)之AC自動機算法的實現(xiàn)