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详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • jmeter中json提取器如何提取多个参数值

    jmeter中json提取器如何提取多个参数值

    关于jmeter中的正则表达式及json提取器可以提取响应值,但是实际可以需要上个接口的多个响应值,本文就详细的介绍一下如何使用,感兴趣的可以了解一下
    2021-11-11
  • Java算法之桶排序Bucket Sort详解

    Java算法之桶排序Bucket Sort详解

    这篇文章主要介绍了Java算法之桶排序Bucket Sort详解,桶排序(Bucket Sort)又称箱排序,是一种比较常用的排序算法,其算法原理是将数组分到有限数量的桶里,再对每个桶分别排好序,最后一次将每个桶中排好序的数输出,需要的朋友可以参考下
    2023-10-10
  • Groovy的规则脚本引擎实例解读

    Groovy的规则脚本引擎实例解读

    这篇文章主要介绍了Groovy的规则脚本引擎实例解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Java面向对象类和对象实例详解

    Java面向对象类和对象实例详解

    面向对象乃是Java语言的核心,是程序设计的思想,这篇文章主要介绍了Java面向对象类和对象的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • SpringBoot瘦身打包部署的实现

    SpringBoot瘦身打包部署的实现

    这篇文章主要介绍了SpringBoot瘦身打包部署的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Java数据结构之AC自动机算法的实现

    Java数据结构之AC自动机算法的实现

    AC自动机算法常被认为是Trie树+KMP算法的结合体,它是一个多模式匹配算法,在模式匹配领域被广泛应用。本文将详细为大家介绍AC自动机的原理与实现方法,感兴趣的可以了解一下
    2022-12-12
  • 详解SpringBoot是如何整合JPA的

    详解SpringBoot是如何整合JPA的

    借助于开发框架,我们已经不用编写原始的访问数据库的代码,也不用调用JDBC或者连接池等诸如此类的被称作底层的代码,我们将从更高的层次上访问数据库,本章我们将详细介绍在Springboot中使用 Spring Data JPA 来实现对数据库的操作,需要的朋友可以参考下
    2021-06-06
  • Springboot死信队列 DLX 配置和使用思路分析

    Springboot死信队列 DLX 配置和使用思路分析

    死信队列简称就是DLX,死信交换机和死信队列和普通的没有区别,当消息成为死信后,如果该队列绑定了死信交换机,则消息会被死信交换机重新路由到死信队列,本文给大家介绍Springboot死信队列 DLX的相关知识,感兴趣的朋友一起看看吧
    2022-03-03
  • Java并发之AQS与自旋锁详解

    Java并发之AQS与自旋锁详解

    这篇文章主要介绍了Java并发之AQS与自旋锁详解,类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch,需要的朋友可以参考下
    2023-10-10
  • MapTask工作机制图文详解

    MapTask工作机制图文详解

    今天小编就为大家分享一篇关于MapTask工作机制图文详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01

最新评论