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 IOC的三种实现方式详解

    Spring IOC的三种实现方式详解

    这篇文章主要介绍了Spring IOC的三种实现方式,在Spring框架中,IOC通过依赖注入来实现,而依赖注入主要有三种实现方式,构造器注入、Setter注入和字段注入,每种方式都有其特点、适用场景和优缺点,需要的朋友可以参考下
    2025-02-02
  • SpringBoot实现对数据库慢查询监控的方案小结

    SpringBoot实现对数据库慢查询监控的方案小结

    在企业级应用开发中,数据库性能往往是系统整体性能的关键瓶颈,因此,对数据库慢查询进行有效监控和及时优化,是保障系统稳定运行的重要环节,下面我们来看看SpringBoot实现慢查询的6种监控方案吧
    2025-06-06
  • Java远程debug调试的操作步骤

    Java远程debug调试的操作步骤

    日常项目中,通常我们的代码都是部署到远程的服务器,有时线上出现了问题,经常需要我们增加一些日志来排查问题,但是如果是测试环境的场景下或者我们能进行远程调试的话,我们就可以使用远程的Debug方式进行远程调试,下面给大家介绍一下Java远程debug调试的操作步骤
    2025-04-04
  • SpringBoot配置嵌入式服务器的实操演示

    SpringBoot配置嵌入式服务器的实操演示

    文章介绍了Servlet、Filter和Listener在JavaWeb开发中的作用及生命周期,文章详细说明了如何在SpringBoot中注册Servlet、Filter和Listener,并通过实操演示验证了它们的功能,本文给大家讲解的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • JAVA实现长连接(含心跳检测Demo)

    JAVA实现长连接(含心跳检测Demo)

    这篇文章主要介绍了JAVA实现长连接(含心跳检测Demo),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Java中lambda表达式的基本运用

    Java中lambda表达式的基本运用

    大家好,本篇文章主要讲的是Java中lambda表达式的基本运用,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • IDEA2020.2.3中创建JavaWeb工程的完整步骤记录

    IDEA2020.2.3中创建JavaWeb工程的完整步骤记录

    这篇文章主要给大家介绍了关于IDEA2020.2.3中创建JavaWeb工程的完整步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • JavaWeb实现显示mysql数据库数据

    JavaWeb实现显示mysql数据库数据

    MySQL是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的。本文将利用JavaWeb实现显示mysql数据库数据功能,需要的可以参考一下
    2022-03-03
  • 一行命令同时修改maven项目中多个module的版本号的方法

    一行命令同时修改maven项目中多个module的版本号的方法

    这篇文章主要介绍了一行命令同时修改maven项目中多个module的版本号的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • Java 日期时间工具包–java.time的使用

    Java 日期时间工具包–java.time的使用

    这篇文章主要介绍了Java 日期时间工具包–java.time的使用,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04

最新评论