Spring扩展点之BeanFactoryPostProcessor详解
作者:扛麻袋的少年
这篇文章主要介绍了Spring扩展点之BeanFactoryPostProcessor详解,Spring的设计非常优雅,有很多的扩展点供我们对项目进行扩展,今天学习一下Spring其中扩展点之一的BeanFactoryPostProcessor,需要的朋友可以参考下
BeanFactoryPostProcessor
即:BeanFactory后置处理器,是实现Spring容器功能扩展的又一重要接口。它是对 BeanDefinition对象进行属性相关的修改。
例如:修改bean属性值,实现bean动态代理等。很多框架都是通过此接口实现对spring容器的扩展,例如mybatis与spring集成时,只定义了mapper接口,无实现类,但spring却可以完成自动注入,是不是很神奇? 本文将通过简单的例子,展现BeanFactoryPostProcessor的扩展能力。
说明:BeanDefinition对象,即:Bean定义对象,里面存储着Bean标签的所有信息,Spring就是通过BeanDefintion对象来生成最终的Bean实例。
执行时机
所有的bean定义信息,已经被加载到IOC容器中,bean实例还没有被初始化时,BeanFactoryPostProcessor被调用。
即:在bean定义已解决被加载到IOC容器中,还没有初始化之前,我们可以悄悄的往容器中添加一些东西,进行一些小动作的修改。
使用
/** * TODO 自定义BeanFactoryPostProcessor * 执行时间:所有的Bean定义信息已经加载到容器中,但是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定义组件扫描包范围,在可扫描的保范围内, * 然后使用@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); } } } }
执行结果
到此这篇关于Spring扩展点之BeanFactoryPostProcessor详解的文章就介绍到这了,更多相关BeanFactoryPostProcessor详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!