一起学SF框架系列5.8-模块Beans-注解bean解析1-解析入口

news2024/11/19 4:41:39

前面跟踪了Spring框架如何解析xml模式配置的bean解析(参见“一起学SF框架系列5.7-模块Beans-BeanDefinition解析”),本文主要解析注解bean(详见“一起学SF框架系列5.2-模块Beans-bean的元数据配置”)是如何被Spring框架解析的。

注解配置

注解bean的配置如下:

	<!-- 配置注解模式 -->
	<context:annotation-config/>
	<!-- 注解模式:配置bean扫描路径 -->
	<context:component-scan base-package="com.learnsf.main,com.learnsf.service,com.learnsf.demo"/>

解析入口

注解解析起点在DefaultBeanDefinitionDocumentReader.parseBeanDefinitions,如下图:
在这里插入图片描述
其中xml解析是方法parseDefaultElement(ele, delegate)。
入口的前面流程参见“一起学SF框架系列5.7-模块Beans-BeanDefinition解析”

解析过程

在这里插入图片描述
注:NamespaceHandlerSupport 根据不同 Namespace选择不同的解析器。

代码跟踪

BeanDefinitionParserDelegate.parseCustomElement(Element ele)

解析非默认命名空间定义的元素。

	//过渡类
	@Nullable
	public BeanDefinition parseCustomElement(Element ele) {
		return parseCustomElement(ele, null);
	}

	// 解析一个非默认命名空间定义的元素
	@Nullable
	public BeanDefinition parseCustomElement(Element ele, @Nullable BeanDefinition containingBd) {
		// 获取命名空间资源符
		String namespaceUri = getNamespaceURI(ele);
		if (namespaceUri == null) {
			return null;
		}
		// 根据命名空间资源符获得对应的解析器
		NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
		if (handler == null) {
			error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri + "]", ele);
			return null;
		}
		// 解析器解析
		return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));
	}

NamespaceHandlerSupport.parse(Element element, ParserContext parserContext)

查找要解析元素对应的BeanDefinitionParser解析元素。

	@Override
	@Nullable
	public BeanDefinition parse(Element element, ParserContext parserContext) {
		// 找元素对应的解析器:BeanDefinitionParser 
		BeanDefinitionParser parser = findParserForElement(element, parserContext);
		// 根据元素解析bean 注1
		return (parser != null ? parser.parse(element, parserContext) : null);
	}

	@Nullable
	private BeanDefinitionParser findParserForElement(Element element, ParserContext parserContext) {
		String localName = parserContext.getDelegate().getLocalName(element);
		BeanDefinitionParser parser = this.parsers.get(localName);
		if (parser == null) {
			parserContext.getReaderContext().fatal(
					"Cannot locate BeanDefinitionParser for element [" + localName + "]", element);
		}
		return parser;
	}

注1:不同元素可能对应不同的解析器,如:
元素context:annotation-config对应AnnotationConfigBeanDefinitionParser,具体如何解析见“一起学SF框架系列5.8-模块Beans-注解bean解析2-解析annotation-config”;
元素context:component-scan对应ComponentScanBeanDefinitionParser,具体如何解析见“一起学SF框架系列5.8-模块Beans-Bean注解解析3-解析component-scan”;

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

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

相关文章

scripy其他

持久化 # 爬回来&#xff0c;解析完了&#xff0c;想存储&#xff0c;有两种方案 ## 方案一&#xff1a;一般不用 parse必须有return值&#xff0c;必须是列表套字典形式--->使用命令&#xff0c;可以保存到json格式中&#xff0c;csv中scrapy crawl cnblogs -o cnbogs.j…

IEEE WCCI-2020电动汽车路由问题进化计算竞赛的基准集

引言 交通一直是二氧化碳排放的主要贡献者。由于全球变暖、污染和气候变化&#xff0c;联邦快递、UPS、DHL和TNT等物流公司对环境变得更加敏感&#xff0c;他们正在投资于减少作为其日常运作的一部分而产生的二氧化碳排放的方法。毫无疑问&#xff0c;使用电动汽车&#xff08;…

JavaWeb——Linux的常用命令

目录 一、Linux优点 二、Linux常用命令 1、ls &#xff08;1&#xff09;、语法 &#xff08;2&#xff09;、功能 &#xff08;3&#xff09;、常用选项 例: 2、pwd &#xff08;1&#xff09;、语法 &#xff08;2&#xff09;、功能 例: 3、cd &#xff08;1&am…

Doc as Code (1):起源

作为技术传播从业者&#xff0c;你一定听说过Doc as Code&#xff0c;中文大家叫做文档代码化。 近年来&#xff0c;这个词在技术传播行业传开了。也许是在某个大会上&#xff0c;也许是在某篇文章中&#xff0c;再或者是在与同行的讨论群里&#xff0c;不管是从哪里&#xff…

DAY47:动态规划(九)完全背包理论基础

文章目录 完全背包示例与01背包的区别&#xff1a;遍历顺序常规遍历写法DP状态图-为什么背包正序就能放进来重复物品 for循环的嵌套&#xff0c;外层物品内层背包能否颠倒&#xff1f;for嵌套顺序颠倒的遍历写法 测试示例面试题目总结 课程链接&#xff1a; 代码随想录 (progr…

自动生成spring-configuration-metadata.json文件

在开发过程中为避免重复修改代码&#xff0c;往往将代码中容易发生变更的值提取出来放到配置文件中。例如数据库连接信息&#xff0c;使用Http调用第三方应用的网关地址等信息。 使用Sprin Boot的ConfigurationPropertie 从配置文件中读取属性值方法多样&#xff0c;这里介绍…

【反向代理】反向代理及其作用

反向代理及其作用 一、什么是正向代理 在介绍反向代理之前我们先介绍什么是正向代理 首先要明确的是&#xff0c;在http协议中正向代理一般被称为代理&#xff0c;在web服务中我们可以通过主动配置代理服务器的方式来发送请求&#xff0c;并通过代理服务器接收服务器的响应。…

自学网络安全(成为黑客)

一、前言 黑客这个名字一直是伴随着互联网发展而来&#xff0c;给大家的第一印象就是很酷&#xff0c;而且技术精湛&#xff0c;在网络世界里无所不能。目前几乎所有的公司企业甚至国家相关部门都会争相高薪聘请技术精湛的黑客作为互联网机构的安全卫士&#xff0c;所以黑客也…

umi框架的使用

umi框架的使用 安装npm i -g yrm 查看yarn镜像源yrm ls 切换源 yrm use taobao 创建项目 yarn create umijs/umi-app 安装依赖yarn 启动项目yarn start 路由组件还可以进行children进行子路由渲染 打个比方&#xff0c;现在有头部导航跟侧边是一致的我们只希望修改每个应…

Mybatis-Plus详解

目录 一、Mybatis-Plus简介 &#xff08;一&#xff09;什么是Mybatis-Plus &#xff08;二&#xff09;Mybatis-Plus的优势 &#xff08;三&#xff09;Mybatis-Plus的框架结构 二、SpringBoot整合Mybatis-Plus入门 &#xff08;一&#xff09;创建maven工程&#xff0c;…

爬虫+Flask+Echarts搭建《深度学习》书评显示大屏

爬虫FlaskEcharts搭建《深度学习》书评显示大屏 1、前言2、实现2.1 挑选想要采集的书籍2.2 构建爬虫2.2.1 采集书籍信息2.2.2 采集书评 2.3 数据清洗2.3.1 清洗书籍信息2.3.2 清洗书评信息 2.4 统计分析&#xff0c;结果持久化存储2.5 搭建flask框架2.6 数据传值2.7 完整代码&a…

什么是Nginx的反向代理与正向代理详解

文章目录 1、什么是正向代理2、什么是反向代理3、反向代理的作用 1、什么是正向代理 正向代理&#xff0c;“它代理的是客户端”&#xff0c;是一个位于客户端和目标服务器之间的服务器&#xff0c;为了从目标服务器取得内容&#xff0c;客户端向代理服务器发送一个请求并指定…

汽车网卡驱动之TJA1101B

TJA1101B汽车网卡驱动(汽车以太网) 1总体描述 2特点和优点 2.1通用 2.2针对汽车用例优化

酷炫音乐盒: python打造自己的音乐播放器

目录标题 前言代码实现尾语 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! Python的Tkinter&#xff08;Tk接口&#xff09;是一个用于创建图形用户界面&#xff08;GUI&#xff09;的标准库。 它是Python的内置模块&#xff0c;无需额外安装即可使用。Tkinter提供了一组…

【字节青训pre】后端笔试练兵

文章目录&#xff1a; 零、前言一、选择题二、编程题1、36进制转换a) 题目b) 解题思路 零、前言 好久没更博客了 &#xff0c; 暑假参加字节青训营&#xff0c;记录一下备战经历&#xff0c;水水博客 。 因该博客持续更新&#xff0c;文中部分链接是写该博客时预存占坑位的&…

【雕爷学编程】Arduino动手做(147)---QMC5883L三轴罗盘模块2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

基于Python+Django+mysql+html学生成绩管理系统

基于PythonDjangomysqlhtml学生成绩管理系统 一、系统介绍二、功能展示1.用户登陆2.主页3.年级管理4.班级管理5.课程管理6.学生管理7.班级管理8.学生管理 三、其它系统四、获取源码 一、系统介绍 成绩录入测试账号&#xff1a;test 密码&#xff1a;123 在线成绩录入&#xff…

redis -速成

目录 &#xff08;一&#xff09;认识 Redis 1.1数据库分类 1.2 什么是Redis 1.2.1 redis简介 1.2.2 谁在用Redis 1.2.3 怎么学redis 1.2.4 Redis的安装 2 数据类型 2.1 概况 2.2 String类型 2.2.1 常用的命令 2.2.2 非常用命令 2.2.3 举例 2.2.4应用场景&#xf…

面试之双亲委派原理

一面腾讯提问:如果我自定义一个 new Object 类&#xff0c;请问这个类是否会被加载&#xff1f; 回答&#xff1a;不会&#xff0c;因为双亲委派&#xff0c;向上加载。回答的过程中磨磨唧唧。当然最后一面也是没有过。 总之一句话&#xff1a;向上加载&#xff0c;向下委派. …

【Linux操作系统】死锁

文章目录 死锁的概念产生死锁问题的必要条件如何避免死锁 有两个小朋友站在超市的零食区&#xff0c;手上各拿着五毛钱&#xff0c;他们直勾勾的看着眼前的棒棒糖&#xff0c;问了问阿姨&#xff0c;这个棒棒糖要一块钱。所以a对b说&#xff1a;“你把你的五毛钱给我买棒棒糖”…