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

news/2024/11/20 1:29:52/

拦截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.ppmy.cn/news/981557.html

相关文章

每日一道面试题之迭代器 Iterator 是什么?

迭代器(Iterator)是一种用于遍历集合(Collection)中元素的对象。它提供了一种统一的方式来访问集合中的元素,而且不需要暴露集合的内部结构,它通常与集合类一起使用,通过调用集合类的 iterator(…

Java设计模式—软件设计原则和七大常用的设计模式

前言 设计模式是软件开发中常见问题的解决方案,它们是经过验证的并且经常被重复使用的设计模板。设计模式提供了一套通用的解决方案,帮助开发人员构建高质量、可维护和可扩展的代码。设计模式并不是特定于某种编程语言,而是面向对象编程范式…

#P1012. [NOIP2015提高组] 神奇的幻方

题目描述 幻方是一种很神奇的 N \times NNN 矩阵:它由数字 1,2,3, \ldots ,N \times N1,2,3,…,NN 构成,且每行、每列及两条对角线上的数字之和都相同。 当 NN 为奇数时,我们可以通过以下方法构建一个幻方: 首先将 11 写在第一行…

python爬虫基础入门——利用requests和BeautifulSoup

(本文是自己学习爬虫的一点笔记和感悟) 经过python的初步学习,对字符串、列表、字典、元祖、条件语句、循环语句……等概念应该已经有了整体印象,终于可以着手做一些小练习来巩固知识点,写爬虫练习再适合不过。 1. 网页基础 爬虫的本质就是从网页中获取所需的信息,对网…

【N32L40X】学习笔记02-gpio输入实例

GPIO 使用实例 该函数库的目的就是在统一的敌方配置gpio&#xff0c;将配置的不同项放置在一个结构体内部没得io口使用一个枚举来定义一个gpio pin的别名 gpio输入实例 key.c #include <stdio.h> #include "key/bsp_key.h" #include "./key/bsp_lib_i…

E2E工程问题:小周期转大周期Gateway

摘要&#xff1a; 本文讨论一个具体的工程问题&#xff0c;E2E报文对应的信号&#xff0c;由小周期转大周期导致的E2E校验失败问题。 工程中&#xff0c;网关节点很重要的一个功能就是路由。当然&#xff0c;E2E&#xff08;End to End&#xff09;报文也可路由&#xff0c;但…

python人工智能编程笔记总结

np.argmax(prob_scores, axis1) 并不是取每一列的最大值。 而是找出每行的最大值&#xff0c;返回最大值的列索引 prob_scores[[ 0.97875 0.021254] [ 0.99951 0.00049028] [ 0.98667 0.01333]] pred_index np.argmax(prob_scores, axis1)得到:[0,0,0] pred_score np.max(…

lambda匿名函数

问题:什么是lambda函数?它有什么好处?举例说明 解答 含义 在Python中,不通过def来声明函数名字,而是通过lambda关键字来定义的函数称为匿名函数,即函数没有具体的名称,你可以理解为一句话写一个函数 Lambda表达式是Python中一类特殊的定义函数的形式,从语义上讲,它…