Spring底层原理(二)

news2024/12/29 8:47:31

Spring底层原理(二)

BeanFactory的实现
//创建BeanFactory对象
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
//注册Bean定义对象
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(SpringConfig.class)
      .setScope("singleton").getBeanDefinition();
factory.registerBeanDefinition("config",beanDefinition);
for (String name : factory.getBeanDefinitionNames()) {
     System.out.println(name);
}

使用AnnotationConfigUtils为容器添加后置处理器

//给BeanFactory添加一些常用的后置处理器,对BeanFactory功能进行增强
AnnotationConfigUtils.registerAnnotationConfigProcessors(factory);
Spring自带的后置处理器
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
  • internalConfigurationAnnotationProcessor:对@Configuration@Bean注解进行解析处理,为BeanFactory后置处理器

  • internalAutowiredAnnotationProcessor:对@Autowired注解进行解析处理,是Bean后置处理器

  • internalCommonAnnotationProcessor:对@Resource注解进行解析处理,是Bean后置处理器

执行BeanFactory后置处理器

Map<String, BeanFactoryPostProcessor> factoryPostProcessorMap = factory.getBeansOfType(BeanFactoryPostProcessor.class);
for (BeanFactoryPostProcessor processor : factoryPostProcessorMap.values()) {
	processor.postProcessBeanFactory(factory);
}
  • 需要调用这些后置处理器的postProcessBeanFactory方法,这些处理器才会生效

BeanFactory后置处理器主要功能:补充了一些bean的定义

关联BeanBean后置处理器

factory.getBeansOfType(BeanPostProcessor.class).values().forEach(factory::addBeanPostProcessor);

Bean后置处理器:针对Bean的生命周期的各个阶段提供拓展,例如@Autowired @Resource

💡BeanFactry中的单例对象并不是预先就创建好的,而是第一次从容器中获取时才进行创建

在这里插入图片描述

如何将这些单例bean预实例化呢?

factory.preInstantiateSingletons();
  • 该方法将所有单例对象进行预实例化

在这里插入图片描述

总结

beanFactory不会做的事

  • 不会主动调用BeanFactory后置处理器
  • 不会主动添加Bean后置处理器
  • 不会主动初始化单例
  • 不会解析beanFactory,也不会解析${}#{}

bean后置处理器会有排序的逻辑

  • AnnotationConfigUtils在调用registerAnnotationConfigProcessors方法后,会自动设置一个排序比较器供后续使用
    在这里插入图片描述

    //默认采用list的排序规则   
    public static void sort(List<?> list) {
       if (list.size() > 1) {
            list.sort(INSTANCE);
        }
    }
    
  • 排序时会调用后置处理器的getOrder方法,该方法会返回一个整数,根据整数排序

    • CommonAnnotationBeanPostProcessor

      this.setOrder(2147483644);
      
    • AutowiredAnnotationBeanPostProcessor

      private int order = 2147483645;
      

    所以当AutowiredResource注解同时使用时会根据后置处理器的顺序决定谁生效

  • 测试排序规则

    ArrayList<Integer> integers = new ArrayList<>();
    integers.add(2147483644);
    integers.add(2147483645);
    integers.sort(AnnotationAwareOrderComparator.INSTANCE);
    //[2147483644, 2147483645]
    
    • 数字越小优先级越高,所以@Resource的优先级更高

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1126859.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring实例化源码解析之Bean的实例化(十二)

前言 本章开始分析finishBeanFactoryInitialization(beanFactory)方法&#xff0c;直译过来就是完成Bean工厂的初始化&#xff0c;这中间就是非lazy单例Bean的实例化流程。ConversionService在第十章已经提前分析了。重点就是最后一句&#xff0c;我们的bean实例化分析就从这里…

蓝桥每日一题(day 6: 蓝桥505.数字三角形)--线性dp--easy

题目&#xff1a; 关注&#xff1a; 本题给出了一个限制&#xff0c;“向左下走的次数与向右下走的次数相差不能超过1”。观察一下&#xff0c;发现&#xff1a;当行数为奇数的时候&#xff0c;只有最后一行的中间的f符合要求&#xff1b;当行数为偶数的时候&#xff0c;只有中…

12.4 组播鼠标批量执行

组播模式相比单播模式可以提高网络的效率和带宽利用率&#xff0c;因为组播数据包只需要发送一次&#xff0c;就可以被多个接收者接收&#xff0c;而不需要每个接收者都单独发送一份数据包。这在需要同时向多个接收者发送相同数据的场景下特别有用&#xff0c;如视频会议、在线…

解救Kubernetes混乱:Descheduler快速实现资源平衡

By default, Kubernetes doesn’t recompute and rebalance workloads. You could have a cluster with fewer overutilized nodes and others with a handful of pods How can you fix this? 关注【云原生百宝箱】公众号&#xff0c;快速掌握云原生 默认情况下&#xff0c;Ku…

RabbitMQ相关的其他知识点

RabbitMQ相关的其他知识点 一、幂等性1.1 概念1.2 消息重复消费1.3 消费端的幂等性保障 二、优先队列2.1 应用场景2.2 实现原理2.3 代码实现 三、惰性队列3.1 定义3.2 应用场景3.3 两种设置模式3.4 内存开销对比 一、幂等性 1.1 概念 用户对于同一操作发起的一次请求或者多次请…

冬天虽冷,希望你们能够坚强一点

养了好多植物&#xff0c;以前来阳台的时候看着个个都挺茂盛&#xff0c;也绿油油的&#xff0c;可天气一变冷&#xff0c;你们当中就有些扛不住了&#xff0c;多肉已经挂了&#xff0c;就剩你们啦&#xff01;希望你们能够坚强一点。

1024程序员节 | 电脑软件:SmartSystemMenu(窗口置顶工具)介绍

目录 一、软件介绍 二、软件用途 三、安装教程 四、功能介绍 五、软件设置 六、软件下载 一、软件介绍 SmartSystemMenu 是一款简单实用的 Windows 窗口增强工具&#xff0c;它可以为窗口的标题栏右键菜单新增 17 个新功能。 二、软件用途 SmartSystemMenu(窗口置顶工具)&#…

Spring实例化源码解析之循环依赖CircularReference(十三)

前言 首先什么是循环依赖&#xff0c;简单说就是互相引用。在Spring中是默认支持循环依赖的&#xff0c;至于怎么解决的循环依赖问题&#xff0c;就是本章要探讨的内容。 // 默认允许循环依赖 private boolean allowCircularReferences true;//提供set方法 public void setA…

Jmeter压测工具和Docker服务端接口压测的安装使用详细教程

安装 参考资料 版本 切换语言 使用步骤 1、新建线程组&#xff1b; 右键“测试计划”(左侧导航中的第一条) > 添加 > 线程&#xff08;用户&#xff09; > 线程组&#xff1b; 线程数&#xff1a;并发数&#xff1b; 2、添加取样器 > HTTP请求&#xff1b; 右…

菜尼奥排错之AttributeError: module ‘mmcv‘ has no attribute ‘dump‘

环境版本&#xff1a; 阿里云PAI平台创建的实例&#xff0c;linux x86-64基础配置如下&#xff1a; pytorch 1.12.0 mmengine 0.8.4 mmcv 2.0.1 mmdet 3.1.0 mmdet3d 1.2.0 报错信息&#xff1a; AttributeError: module mmcv has no attribute dump 本人是在mmcv.dum…

第18章 SpringCloud生态(三)

18.21 Nacos能存储什么样格式的数据(配置中心) 难度:★ 重点:★ 白话解析 看下面这副Nacos控制台的截图就明白了 参考答案 六种格式数据:Text、JSON、XML、Yaml、HTML和Properties格式。 18.22 Nacos是如何实现配置动态更新的(配置中心) 难度:★★ 重点:★★★ 白话…

Linux命令之网络命令ifconfig

一、ifconfig命令简介 ifconfig命令是Linux系统下的一个网络配置工具&#xff0c;用于查看和设置网络接口的配置信息。通过ifconfig命令&#xff0c;用户可以查看当前系统中所有网络接口的详细信息&#xff0c;如IP地址、子网掩码、广播地址等。同时&#xff0c;用户还可以使用…

vue判断是pc端还是手机端访问

首先编写一个util.ts工具类&#xff0c;用作判断访问进来的是pc还是手机端 //判断是否是移动端 export function _isMobile(): boolean {return navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|w…

2023年10月24日程序员节

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

源码编译安装Apache

目录 ✨apache安装步骤 &#x1f36d;挂载镜像 &#x1f36d;解压并安装 &#x1f36d;安装主程序 &#x1f36d;优化链接及服务 &#x1f36d;查看httpd模块 &#x1f36d;查看mpm配置文件 &#x1f36d;查看apache主页 &#x1f36d;使用ab命令进行压力测试 &#x1f990;博客…

【idea】win 10 / win 11:idea 、Alibaba Dragonwell 11、maven、git下载与安装

目录 一、安装 jdk&#xff1a;Alibaba Dragonwell 11 &#xff08;1&#xff09;下载&#xff1a;Alibaba Dragonwell 11 &#xff08;2&#xff09;解压&#xff1a;Alibaba Dragonwell 11 &#xff08;3&#xff09;配置系统环境变量&#xff1a;jdk &#xff08;4&a…

二、虚拟机克隆和快照

1.虚拟机克隆 如果你已经安装了一台Linux操作系统&#xff0c;你还想要更多的&#xff0c;这个时候没有必要重新装&#xff0c;只需要克隆就可以 方式1&#xff1a;直接拷贝一份安装好的虚拟机文件 方式2&#xff1a;使用vmware的克隆操作 注意&#xff0c;克隆时&#xff0c;…

“深入理解C++类默认成员函数:探索构造、析构与复制“

文章目录 类的8个默认成员函数构造函数析构函数拷贝构造移动构造赋值运算符重载移动赋值运算符重载取地址及const取地址操作符重载 强制生成默认函数的关键字default禁止生成默认函数的关键字delete 类的8个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空…

[黑马程序员SpringBoot2]——基础篇1

目录&#xff1a; SpringBoot入门案例&#xff08;Idea联网版&#xff09;SpringBoot入门案例&#xff08;官网创建版&#xff09;SpringBoot入门案例&#xff08;阿里云版&#xff09;SpringBoot入门案例&#xff08;手工制作版&#xff09;教你一招&#xff0c;隐藏文件或文件…

【大数据】Hadoop

文章目录 概述Hadoop组成HDFSMapReduce写MapReduce程序&#xff08;Hadoop streaming&#xff09; YARNHadoop 启动 工作方式Hadoop的主从工作方式Hadoop的守护进程 运行模式本地运行模式伪分布式运行模式完全分布式运行模式 Hadoop高可用的解决方案ZooKeeper quorumZKFC 环境搭…