Spring擴展點之BeanFactoryPostProcessor詳解
BeanFactoryPostProcessor
即:BeanFactory后置處理器,是實現(xiàn)Spring容器功能擴展的又一重要接口。它是對 BeanDefinition對象進行屬性相關的修改。
例如:修改bean屬性值,實現(xiàn)bean動態(tài)代理等。很多框架都是通過此接口實現(xiàn)對spring容器的擴展,例如mybatis與spring集成時,只定義了mapper接口,無實現(xiàn)類,但spring卻可以完成自動注入,是不是很神奇? 本文將通過簡單的例子,展現(xiàn)BeanFactoryPostProcessor的擴展能力。
說明:BeanDefinition對象,即:Bean定義對象,里面存儲著Bean標簽的所有信息,Spring就是通過BeanDefintion對象來生成最終的Bean實例。
執(zhí)行時機
所有的bean定義信息,已經(jīng)被加載到IOC容器中,bean實例還沒有被初始化時,BeanFactoryPostProcessor被調用。
即:在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 容器調用了MyBeanFactoryPostProcessor中重寫的postProcessBeanFactory方法"); for(String name:beanFactory.getBeanDefinitionNames()) { if("person".equals(name)) { System.out.println("將Person對象設置為懶加載"); BeanDefinition beanDefinition = beanFactory.getBeanDefinition(name); beanDefinition.setLazyInit(true); } } } }
使其生效,有如下兩種方式:
方式一
使用@Configuration + @Bean 方式初始化
/** * 定義一個主配置類,標識為@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 容器調用了MyBeanFactoryPostProcessor中重寫的postProcessBeanFactory方法"); // 獲取Bean定義名稱,進行遍歷 for(String name:beanFactory.getBeanDefinitionNames()) { // 如果是person對象 if("person".equals(name)) { System.out.println("將Person對象設置為懶加載"); // 獲取person的BeanDefinition(Bean定義對象) BeanDefinition beanDefinition = beanFactory.getBeanDefinition(name); // 將Person對象設置為懶加載 beanDefinition.setLazyInit(true); } } } }
執(zhí)行結果
到此這篇關于Spring擴展點之BeanFactoryPostProcessor詳解的文章就介紹到這了,更多相關BeanFactoryPostProcessor詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java數(shù)據(jù)結構之AC自動機算法的實現(xiàn)
AC自動機算法常被認為是Trie樹+KMP算法的結合體,它是一個多模式匹配算法,在模式匹配領域被廣泛應用。本文將詳細為大家介紹AC自動機的原理與實現(xiàn)方法,感興趣的可以了解一下2022-12-12