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

拦截Bean使用之前各个时机的Spring组件

拦截Bean使用之前各个时机的Spring组件

  • 之前使用过的BeanPostProcessor就是在Bean实例化之后,注入属性值之前的时机。
    Spring Bean的生命周期
  • 本次演示的是在Bean实例化之前的时机,使用BeanFactoryPostProcessor进行验证,以及在加载Bean之前进行拦截的,BeanDefinitionRegistryProcessor

Bean被使用前的时机

声明、解析、实例化、注入属性值

在这里插入图片描述

解析Bean前——BeanDefinitionRegistryPostProcessor

/*** 在解析Bean之前对容器的信息进行拦截*/
@Component
public class TestBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {/*** 执行加载Bean之前*/@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {// 可以手动的给容器注册BeanBeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(Banana.class);AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();registry.registerBeanDefinition("myOrange", beanDefinition);}/*** 执行加载Bean之后*/@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {System.out.println("BeanDefinitionRegistryPostProcessor: " + beanFactory.getBean("myOrange", Banana.class));}
}

实例化Bean前——BeanFactoryPostProcessor

/*** 在给每一个Bean实例化之前,获取该容器*/
@Component
public class TestBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {// 根据name 获取相应的Bean对象// BeanDefinition beanDefinition = beanFactory.getBeanDefinition("");// 获取容器中bean的个数
//        int beanDefinitionCount = beanFactory.getBeanDefinitionCount();
//        System.out.println("beanDefinitionCount:" + beanDefinitionCount);// 获取已经实例化的Bean
//        String[] beanDefinitionNames = beanFactory.getBeanDefinitionNames();
//        for (String beanDefinitionName : beanDefinitionNames) {
//            System.out.println(beanDefinitionName);
//        }// 获取当前时机之前使用过的拦截器
//        BeanFactory parentBeanFactory = beanFactory.getParentBeanFactory();
//        System.out.println("BeanFactoryPostProcessor ParentFactory: " + parentBeanFactory);System.out.println("BeanFactoryPostProcessor: " + beanFactory.getBean("myOrange", Banana.class));}
}

测试代码

public static void configContext() {AnnotationConfigApplicationContext configContext = new AnnotationConfigApplicationContext();// 测试BeanDefinitionRegistryPostProcessorconfigContext.register(BeanConfiguration.class);configContext.refresh();System.out.println("configContext: " + configContext.getBean("myOrange", Banana.class));}

配置类

@Configuration
@Import({TestBeanDefinitionRegistryPostProcessor.class, TestBeanFactoryPostProcessor.class })
public class BeanConfiguration {
}

结果

在这里插入图片描述

http://www.lryc.cn/news/96949.html

相关文章:

  • RT thread 之 Nand flash 读写过程分析
  • 独立站最全出单营销指南,新手卖家赶紧学起来吧!
  • Git移除commit过的大文件
  • 再见 Spring Boot 1.X ,Spring Boot 2.X 走向舞台中心
  • Jsonp劫持
  • STM32CubeIDE(串口)
  • Python编程很简单,四步菜鸟到高手(文末送书5本)
  • Labview串口通信MSComm实现串口收发
  • 字节跳动 EB 级 Iceberg 数据湖的机器学习应用与优化
  • CentOS 安装Mysql8
  • 3-Linux实操
  • Yarn 集群的架构和工作原理
  • PostgreSQL-视图-03-查询对象依赖关系视图-dba_dependencies
  • Vue style中的 scoped 属性
  • 移动端适配rem
  • Go语言开发小技巧易错点100例(八)
  • 100个网络安全测试面试题
  • 7.26 作业 QT
  • Python - Opencv应用实例之树叶自动分割、标签及统计分析系统
  • IC设计工程师,参加IC面试应该注意哪些细节?
  • java poi导入Excel、导出excel
  • 【算法与数据结构】101、LeetCode对称二叉树
  • 【N32L40X】学习笔记04-gpio中断库
  • Godot 4 着色器 - Shader调试
  • liunx时间慢几分钟,定时更新系统时间
  • C# 委托详解
  • chatGPT 学习分享:内含PPT分享下载
  • 使用CRM进行数据分析的四大好处
  • Excel“牛人”变现方案参考
  • vscode和jetbrains IDEA添加免费的gpt代码生成插件