Spring扩展点之BeanFactoryPostProcessor详解

 更新时间:2023年11月24日 08:57:00   作者:扛麻袋的少年  
这篇文章主要介绍了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详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring cloud eureka注册原理-注册失败填坑笔记

    spring cloud eureka注册原理-注册失败填坑笔记

    这篇文章主要介绍了spring cloud eureka注册原理-注册失败填坑笔记,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • 使用mongoTemplate实现多条件加分组查询方式

    使用mongoTemplate实现多条件加分组查询方式

    这篇文章主要介绍了使用mongoTemplate实现多条件加分组查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java实现单链表的操作

    Java实现单链表的操作

    这篇文章主要为大家详细介绍了Java实现单链表的操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 解决springboot 2.x集成log4j2调试日志无法关闭的问题

    解决springboot 2.x集成log4j2调试日志无法关闭的问题

    这篇文章主要介绍了解决springboot 2.x集成log4j2调试日志无法关闭的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • spring+mybatis实现图书管理系统

    spring+mybatis实现图书管理系统

    这篇文章主要为大家详细介绍了spring+mybatis实现图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • java基于正则提取字符串中的数字功能【如提取短信中的验证码】

    java基于正则提取字符串中的数字功能【如提取短信中的验证码】

    这篇文章主要介绍了java基于正则提取字符串中的数字功能,可用于提取短信中的验证码,涉及java基于正则的字符串匹配相关操作技巧,需要的朋友可以参考下
    2017-01-01
  • Java TreeMap排序算法实例

    Java TreeMap排序算法实例

    这篇文章主要介绍了Java TreeMap排序算法,结合实例形式分析了TreeMap排序算法的原理、实现方法与相关注意事项,需要的朋友可以参考下
    2017-07-07
  • 三种Java求最大值的方法

    三种Java求最大值的方法

    本篇文章给大家总结了在JAVA中求最大值的三种常用方法,以及代码做了分享,需要的朋友参考下。
    2018-02-02
  • java 如何远程控制tomcat启动关机

    java 如何远程控制tomcat启动关机

    这篇文章主要介绍了java 远程控制tomcat启动关机的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • spring中的懒加载详细解读

    spring中的懒加载详细解读

    这篇文章主要介绍了spring中的懒加载详细解读,如果某个Bean再程序运行周期中都可能不会被适用,那么可以设定该Bean为懒加载,优势是尽量节省了服务器的资源,缺点是可能会导致某个相应的时间增加,需要的朋友可以参考下
    2023-10-10

最新评论