当前位置: 首页 > news >正文

Spring之【Bean工厂后置处理器】

目录

BeanFactoryPostProcessor

BeanDefinitionRegistryPostProcessor

使用一下Bean工厂后置处理器

定义包扫描范围

定义一个组件Bean

定义一个普通的类

自定义一个组件类实现Bean工厂后处理器

测试类


BeanFactoryPostProcessor

  • 该接口是Spring提供的扩展点之一
  • 是一个函数式接口,只有一个抽象方法
  • Spring会在合适的时机执行方法回调,并将bean工厂作为参数传递进去

既然把ConfigurableListableBeanFactory类型的bean工厂传递过来了,那么该类型中的方法我是不是就可以为所欲为地为自己所用了啊

package org.springframework.beans.factory.config;import org.springframework.beans.BeansException;// 函数式接口
@FunctionalInterface
public interface BeanFactoryPostProcessor {// 参数为bean工厂void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;}

BeanDefinitionRegistryPostProcessor

  • 是BeanFactoryPostProcessor的子接口
  • 自身提供了一个将BeanDefinitionRegistry作为参数传递进来的方法

把BeanDefinitionRegistry传递过来了,BeanDefinitionRegistry是用来管理BeanDefinition的,提供了一系列操作BeanDefinition的方法,那么我就可以操作Spring容器中的BeanDefinition了

package org.springframework.beans.factory.support;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;// 继承了BeanFactoryPostProcessor
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {// 将BeanDefinitionRegistry作为参数void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;}

使用一下Bean工厂后置处理器

定义包扫描范围

package spring.demo;import org.springframework.context.annotation.ComponentScan;// 扫描spring.demo及其子包
@ComponentScan("spring.demo")
public class SpringConfig {
}

定义一个组件Bean

package spring.demo;import org.springframework.stereotype.Component;// 这里添加了@Component注解
// Spring容器启动过程中通过ConfigurationClassPostProcessor解析@Component注解,将Cat类的BeanDefinitoon放入容器中
@Component
public class Cat {
}

定义一个普通的类

package spring.demo;// Dog类只是一个普通的Java类,没加任何注解
public class Dog {
}

自定义一个组件类实现Bean工厂后处理器

package spring.demo;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.stereotype.Component;@Component
public class CustomBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {// Dog类只是一个普通的类// 在这里我通过Spring的回调拿到BeanDefinitionRegistry// 通过BeanDefinitionRegistry将Dog类的定义信息放入Spring容器中GenericBeanDefinition beanDefinition = new GenericBeanDefinition();beanDefinition.setBeanClass(Dog.class);registry.registerBeanDefinition("dog", beanDefinition);}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {// Spring回调将beanFactory传递过来// 这里通过beanName从beanFactory中获取到对应的BeanDefinition信息BeanDefinition catBeanDefinition = beanFactory.getBeanDefinition("cat");String beanClassName = catBeanDefinition.getBeanClassName();// 这里打印出:spring.demo.CatSystem.out.println(beanClassName);}
}

测试类

package spring.demo;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class SpringMain {public static void main(String[] args) {// 启动Spring容器AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);// 从容器中获取beanName为cat的beanObject catBean = applicationContext.getBean("cat");// 这里打印出:spring.demo.Cat@4310d43System.out.println(catBean);// 从容器中获取beanName为cat的beanObject dogBean = applicationContext.getBean("dog");// 这里打印出:spring.demo.Dog@54a7079eSystem.out.println(dogBean);}
}

http://www.xdnf.cn/news/1168471.html

相关文章:

  • MybatisPlus入门指南
  • LeetCode 658.找到K个最接近的元素
  • 豪鹏科技锚定 “AI + 固态” 赛道:从电池制造商到核心能源方案引领者的战略跃迁
  • leetcode 1695. 删除子数组的最大得分 中等
  • 浏览器解码顺序xss
  • 低成本、高泛化能力的无人机自主飞行!VLM-Nav:基于单目视觉与视觉语言模型的无地图无人机导航
  • excle中匹配加密手机号(同sheet中)
  • Springboot + MyBatis-Plus + PageHelper 分页性能混合优化方案
  • 解决栅格数据裁剪矢量数据问题两种方法,ArcGIS解决与PYTHON解决
  • 物联网_TDengine_EMQX_性能测试
  • 【Android】xml和Java两种方式实现发送邮件页面
  • API网关原理与使用场景详解
  • Apache Ignite 中 WHERE 子句中的子查询(Subqueries in WHERE Clause)的执行方式
  • Linux操作系统从入门到实战(十二)Linux操作系统第一个程序(进度条)
  • 北京养老金计算公式网页实现案例:从需求分析到架构设计
  • J2EE模式---前端控制器模式
  • Python 绘制各类折线图全指南:从基础到进阶
  • k8s:离线部署tomcatV11.0.9,报Cannot find /opt/bitnami/tomcat/bin/setclasspath.sh
  • zabbix“专家坐诊”第295期问答
  • 以太网基础⑥ ZYNQ PS端 基于LWIP的TCP例程测试
  • MATLAB软件使用频繁,企业如何做到“少买多用”?
  • MFC类Qt的自动布局框架
  • 力扣-链表相关题 持续更新中。。。。。。
  • UE5 UI ScrollBox 滚动框
  • 欧拉系统二进制部署Docker
  • Linux_Ext系列文件系统基本认识(一)
  • Fluent许可与网络安全策略
  • 【洛谷】用两个数组实现静态单链表、静态双向链表,排队顺序
  • 【C语言进阶】动态内存管理(1)
  • 赋能未来数学课堂——基于Qwen3、LangChain与Agent架构的个性化教辅系统研究