Spring源码解析-注册配置信息

news2024/11/17 14:50:01

1、注册方法概述

register(componentClasses) 注册配置类的信息。其中componentClasses 为传入的配置类class。

通过AnnotatedBeanDefinitionReaderregister(this.reader.register(componentClasses))方法。AnnotatedBeanDefinitionReader 已经注册了系统自带的处理器以及方法。就可以直接解析配置类中的属性和方法了。最终调用的是org.springframework.context.annotation.AnnotatedBeanDefinitionReader#doRegisterBean方法,遍历配置类以此处理。

主要处理的流程如下:

  • 读取配置类的信息,将信息封装到AnnotatedGenericBeanDefinition 对象中。

  • 通过注解工具处理AnnotatedGenericBeanDefinition 中的注解。

  • 将配置类的AnnotatedGenericBeanDefinitionbeanName 封装成BeanDefinitionHolder

  • BeanDefinitionHolder 注册到BeanDefinitionRegistry中,也就是当前的context(AnnotationConfigApplicationContext)中。

2、读取配置类的信息

主要方法:new AnnotatedGenericBeanDefinition(beanClass)

该方法主要获取配置类注解的元数据(AnnotationMetadata),只是获取不做任何处理。

该对象内部主要保存两个对象:

  • 配置类的Class对象(Object beanClass

  • 配置类的注解元数据(AnnotationMetadata metadata

  • setBeanClass(beanClass) 将当前的配置类交给AnnotatedGenericBeanDefinition 对象

  • this.metadata = AnnotationMetadata.introspect(beanClass) 通过AnnotationMetadata 的静态方法获取配置类的注解元数据

3、设置配置类的其他属性

abd.setInstanceSupplier(supplier);
ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);
abd.setScope(scopeMetadata.getScopeName());
String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));
  • 设置实例的创建方式(abd.setInstanceSupplier(supplier)

    supplier 参数默认为空,该参数可以将实例对象交给Spring管理,不需要遵守Bean严格的创建过程

  • 设置实例的作用域(abd.setScope(scopeMetadata.getScopeName())

    也就是实例单例还是多例

4、通过注解工具处理AnnotatedGenericBeanDefinition 中的注解

AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);

解析注解元数据中的注定注解,并设置到Bean定义的属性中

处理的注解:

  • 懒加载 @Lazy

  • 优先级 @Primary

  • 依赖条件 @DependsOn

  • 角色 @Role

  • 描述 @Description

if (qualifiers != null) {
    for (Class<? extends Annotation> qualifier : qualifiers) {
        if (Primary.class == qualifier) {
            abd.setPrimary(true);
        }
        else if (Lazy.class == qualifier) {
            abd.setLazyInit(true);
        }
        else {
            abd.addQualifier(new AutowireCandidateQualifier(qualifier));
        }
    }
}

如果 qualifier 参数有值,则优先获取qualifier 中的属性并覆盖上面的值,包含的注解:

  • 懒加载 @Lazy

  • 优先级 @Primary

5、封装BeanDefinitionHolder

BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);

将BeanName和Bean的定义信息封装成新的对象。如果是代理对象则按照代理对象封装BeanDefinitionHolder

6、Bean定义信息注册到当前的Context

BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);

注册信息主要是三个属性beanDefinitionbeanNamealiases。将这些属性注册到当前的Context(registry)中

7、小结

注册配置的方法很简单,就是解析配置的注解信息,并装所有的注解信息、Bean的名称、别名注册到AnnotationConfigApplicationContext(registry)中。

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

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

相关文章

程序化广告系列之一---名词解释

基础 1、DSP&#xff1a;全称“Demand-Side Platform”&#xff0c;需求方平台&#xff0c;是为广告主、代理商提供一个综合性的管理平台&#xff0c;通过统一界面管理多个数字广告和数据交换账户。 2、SSP&#xff1a;SSP是Sell-Side Platform的缩写&#xff0c;即供应方平台…

边缘计算技术的崭新篇章:赋能未来智能系统

边缘计算是近年来云计算和物联网技术发展的重要趋势。通过将数据处理和分析从云端迁移到设备边缘&#xff0c;边缘计算能够实现更低的延迟和更高的数据安全。本文将探索边缘计算技术的最新进展及其在不同行业中的应用场景。 1. 实时数据处理与决策 在需要快速响应的场景中&…

电脑技巧:Win10飞行模式相关知识介绍

目录 一、飞行模式简介 二、如何开关Windows 10中的飞行模式 方法一&#xff1a;使用硬件开关 方法二&#xff1a;使用Windows 10操作中心 方法三&#xff1a;使用Windows 10设置 三、飞行模式开关被卡住、变灰或不工作时怎么办 什么是 Windows 10 飞行模式? 用户如何打…

matlab simulink ADRC控制样例

1、内容简介 略 3-可以交流、咨询、答疑 2、内容说明 用adrc控制传递函数&#xff0c;保证输出达到预期 ADRC控制器、传递函数 3、仿真分析 4、参考论文 略

计算机网络重点概念整理-第六章 应用层【期末复习|考研复习】

第六章 应用层 【期末复习|考研复习】 计算机网络系列文章传送门&#xff1a; 第一章 计算机网络概述 第二章 物理层 第三章 数据链路层 第四章 网络层 第五章 传输层 第六章 应用层 第七章 网络安全 计算机网络整理-简称&缩写 文章目录 第六章 应用层 【期末复习|考研复习…

(一)MySQL-架构

一、MySQL逻辑架构 中间是MySQL的核心服务&#xff0c;包括查询分析、优化、缓存及所有的内置函数(日期、时间、数据等)&#xff0c;所有跨存储的引擎的功能都在这一层实现&#xff1a;存储过程、触发器、视图等。 存储引擎负责MySQL中的存储和提取。服务器通过A…

数字孪生与智慧城市:开启未来智慧生活

在数字时代的浪潮中&#xff0c;数字孪生技术和智慧城市的理念相互交织&#xff0c;共同塑造了一个更智能、更可持续、更宜居的未来。数字孪生是一项前沿技术&#xff0c;将虚拟世界与现实世界相融合&#xff0c;为城市管理者和市民带来了前所未有的机遇和便捷。 数字孪生模型是…

AD原理图如何转换为OrCAD原理图?

在电子工程领域&#xff0c;原理图是用于描述电路设计的重要工具&#xff0c;虽然Altium Designer&#xff08;AD&#xff09;和OrCAD都是广泛使用的原理图绘制工具&#xff0c;但他们之间存在一定的差异&#xff0c;因此如果你遇见了需要将AD原理图转为OrCAD原理图&#xff0c…

C语言数据结构之链表

目录 顺序存储和链式存储 数组—顺序存储 链表—链式存储 单链表 单链表的基本设计 单链表概念&设计 单链表的基本操作 双向链表 双向链表的基本设计 双向链表的基本操作 循环链表 循环链表的介绍及创建 循环链表的基本操作 顺序存储和链式存储 数组—顺序存…

计算机操作系统重点概念整理-第五章 文件管理【期末复习|考研复习】

第五章 文件管理 【期末复习|考研复习】 计算机操作系统系列文章传送门&#xff1a; 第一章 计算机系统概述 第二章 进程管理 第三章 进程同步 第四章 内存管理 第五章 文件管理 第六章 输出输出I/O管理 文章目录 第五章 文件管理 【期末复习|考研复习】前言五、文件管理5.1 文…

iOS Xcode15 适配:Other Linker Flags:-ld_classic

0x00 适配是一条没有尽头的路 Xcode 14 毛问题都没有&#xff0c;Xcode 15 崩溃 看图说话 0x01 解决方案 Other Linker Flags 添加 -ld_classic 即可 0x02 我的小作品 欢迎体验我的作品之一&#xff1a;小挑战-XGame 拼图游戏&#xff0c;渐变色游戏&#xff0c;经典24点游…

中南林业科技大学javaweb实验报告

文章目录 &#x1f4cd; 前置说明实验一 Web服务器开发环境配置一、实验目的二、实验内容三、实验步骤3.1 JDK 的安装与配置3.2 IDEA 中配置 Tomcat3.3 创建 Web 工程3.4 配置 web 工程3.5 运行服务3.6 乱码的解决 四、实验心得 实验二 HTML和Javascript的应用一、实验目的二、…

AI 浪潮下的创业故事(二)|Azure OpenAI Service - ChatU

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun 微软 Reactor 为帮助广开发者&#xff0c;技术爱好者&#xff0c;更好的学习 .NET Core, C#, Python&#xff0c;数据科学&#xff0c;机器学习&#xff0c;AI&#xff0c;区块链, IoT 等技术&#xff0…

vue3 源码解析(2)— ref、toRef、toRefs、shallowRef 响应式的实现

前言 vue3 源码解析&#xff08;1&#xff09;— reactive 响应式实现 介绍完 reactive 之后还有另一个很重要的响应式API&#xff0c;其中包括 ref、toRef、toRefs 和 shallowRef。这些API在vue3中起着至关重要的作用&#xff0c;它们帮助我们更好地管理和跟踪响应式数据的变…

【数据结构】搜索树 与 Java集合框架中的Set,Map

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力…

C# OpenCvSharp Yolov8 Face Landmarks 人脸特征检测

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace OpenCvSharp_Yolov8_Demo {public partial class frmMain…

C++数据结构X篇_25_堆排序(不稳定的排序)

本篇根据十大经典排序算法-堆排序算法详解进行整理和补充。 文章目录 1. 基础知识点1.1 完全二叉树1.2 堆的基础知识 2. 堆排序2.1 什么是堆排序2.2 算法原理2.2.1 理解方法12.2.2 理解方法2 2.3 算法实现 3. 堆排序算法特点3.1 时间复杂度3.2 空间复杂度3.3 稳定性 1. 基础知…

深度学习| U-Net网络

U-Net网络 基础知识和CNN的关系反卷积ReLU激活函数 U-Net入门U-Net网络结构图为什么需要跳跃连接U-Net的输入U-Net的应用 基础知识 理解U-Net网络结构需要相关知识点。 和CNN的关系 U-Net也是CNN&#xff08;Convolutional Neural Network&#xff0c;卷积神经网络&#xff…

网络架构学习1

文章目录 网络架构学习11. 传统CNN卷积神经网络1.1 基本思想1.2 VCG16(经典CNN网络架构之一) 2. 两种经典的网络架构2.1 FCN网络2.2 U-Net网络 3. FCNVMB(基于U-Net架构)3.1 FCNVMB 主要思想3.2 FCNVMB 提供的其他思想 网络架构学习1 1. 传统CNN卷积神经网络 1.1 基本思想 C…

Android SurfaceFlinger做Layer合成时,如何与HAL层进行交互

目录 零、本文讨论问题的范围一、问题&#xff1a;SurfaceFlinger图层合成选择实现方式的两难1.1 从OpenGL ES、HWC本身来讲1.2 以HWC为主导的判断逻辑 二、SurfaceFlinger与HAL层进行交互的具体实现框架2.1 SurfaceFlinger 调用 OpenGL ES 流程2.2 FrameBuffer2.3 SurfaceFlin…