SpringSecurity初始化的本质

news2025/2/23 7:27:45

一、对SpringSecurity初始化的几个疑问

  通过前面第一次请求访问的分析我们明白了一个请求就来后的具体处理流程

image.png

  对于一个请求到来后会通过FilterChainProxy来匹配一个对应的过滤器链来处理该请求。那么这里我们就有几个疑惑。

  1. FilterChainProxy什么时候创建的?
  2. 过滤器链和对应的过滤器什么时候创建的?
  3. 怎么把自定义的过滤器添加到过滤器链中?
  4. 请求和过滤器的匹配规则是什么?

二、解析配置文件的过程

1.解析前的处理

  接下来我们来分析下Spring初始化的时候是如果解析SpringSecurity的配置文件的,并且存储在哪了?同时来解释我们上面的几个疑问。

首先系统启动的时候会触发在 web.xml中配置的ContextLoaderListener监听器

image.png

然后会执行对应的initWebApplicationContext方法

image.png

然后进入configureAndRefreshWebApplicationContext方法中。

image.png

然后进入refresh()方法

	@Override
	public void refresh() throws BeansException, IllegalStateException {
   
		synchronized (this.startupShutdownMonitor) {
   
			// Prepare this context for refreshing.
			/**
			 * 前戏,做容器刷新前的准备工作
			 * 1、设置容器的启动时间
			 * 2、设置活跃状态为true
			 * 3、设置关闭状态为false
			 * 4、获取Environment对象,并加载当前系统的属性值到Environment对象中
			 * 5、准备监听器和事件的集合对象,默认为空的集合
			 */

			prepareRefresh();

			// Tell the subclass to refresh the internal bean factory.
			// 创建容器对象:DefaultListableBeanFactory
			// 加载xml配置文件的属性值到当前工厂中,最重要的就是BeanDefinition
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// Prepare the bean factory for use in this context.
			// beanFactory的准备工作,对各种属性进行填充
			prepareBeanFactory(beanFactory);

			try {
   
				// Allows post-processing of the bean factory in context subclasses.
				// 子类覆盖方法做额外的处理,此处我们自己一般不做任何扩展工作,但是可以查看web中的代码,是有具体实现的
				postProcessBeanFactory(beanFactory);

				// Invoke factory processors registered as beans in the context.
				// 调用各种beanFactory处理器
				invokeBeanFactoryPostProcessors(beanFactory);

				// Register bean processors that intercept bean creation.
				// 注册bean处理器,这里只是注册功能,真正调用的是getBean方法
				registerBeanPostProcessors(beanFactory);

				// Initialize message source for this context.
				// 为上下文初始化message源,即不同语言的消息体,国际化处理,在springmvc的时候通过国际化的代码重点讲
				initMessageSource();

				// Initialize event multicaster for this context.
				// 初始化事件监听多路广播器
				initApplicationEventMulticaster();

				// Initialize other special beans in specific context subclasses.
				// 留给子类来初始化其他的bean
				onRefresh();

				// Check for listener beans and register them.
				// 在所有注册的bean中查找listener bean,注册到消息广播器中
				registerListeners();

				// Instantiate all remaining (non-lazy-init) singletons.
				// 初始化剩下的单实例(非懒加载的)
				finishBeanFactoryInitialization(beanFactory);

				// Last step: publish corresponding event.
				// 完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent通知别人
				finishRefresh();
			}

			catch (BeansException ex) {
   
				if (logger.isWarnEnabled()) {
   
					logger.warn("Exception encountered during context initialization - " +
							"cancelling refresh attempt: " + ex);
				}

				// Destroy already created singletons to avoid dangling resources.
				// 为防止bean资源占用,在异常处理中,销毁已经在前面过程中生成的单件bean
				destroyBeans();

				// Reset 'active' flag.
				// 重置active标志
				cancelRefresh(ex);

				// Propagate exception to caller.
				throw ex;
			}

			finally {
   
				// Reset common introspection caches in Spring's core, since we
				// might not ever need metadata for singleton beans anymore...
				resetCommonCaches();
			}
		}
	}

我们要看配置文件的加载解析需要进入obtainFreshBeanFactory()方法中。

image.png

再继续进入

image.png

继续

image.png

这块会比较绕,直接截图进关键代码

image.png

一步

image.png

两步

image.png

三步

image.png

慢慢进入

image.png

image.png

image.png

image.png

image.png

开始具体的配置文件的加载解析

image.png

2.解析过程

  在上面的步骤基础上我们进入registerBeanDefinitions方法中来看看是如何具体实现配置文件的解析操作

image.png

然后进入registerBeanDefinitions方法中

image.png

继续

image.png

进入parseBeanDefinitions方法中,就会开始对应的节点解析。

image.png

parseDefaultElement方法会完成Spring中提供的默认方法解析,具体如下:

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

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

相关文章

自注意力机制和CNN的区别

CNN:一种只能在固定感受野范围内进行关注的自注意力机制。​CNN是自注意力的简化版本。自注意力:具有可学习感受野的CNN。自注意力是CNN的复杂形态,是更灵活的CNN,经过某些设计就可以变为CNN。 越灵活、越大的模型,需要…

本地部署DeepSeek-R1模型教程

文章目录 第一步:安装运行框架 哈喽各位小伙伴们,最近deepseek非常的火,不过因为全球访问量剧增经常会导致deepseek的服务器繁忙,如果想要稳定使用就得靠本地部署了,不仅可以稳定使用还能保护数据隐私,今天…

k2路由器登录校园网

教程1刷入Breed,并手动刷入Padavan固件:斐讯K1、K2、K2P 刷机、刷入Breed 辅助工具 | tb (tbvv.net) Padavan下载网址: 我用的是: Padavan 登录的网址是 192.168.123.1 Padavan配置教程: 先用网线连上校园网&#…

基于Springboot学生宿舍水电信息管理系统【附源码】

基于Springboot学生宿舍水电信息管理系统 效果如下: 系统登陆页面 系统用户首页 用电信息页面 公告信息页面 管理员主页面 用水信息管理页面 公告信息页面 用户用电统计页面 研究背景 随着高校后勤管理信息化的不断推进,学生宿舍水电管理作为高校后勤…

手机怎样玩电脑游戏?

如果您正在寻找一款能够实现手机远程控制电脑玩游戏的软件,本文推荐远程看看软件。这款软件不仅支持手机远程控制电脑,还具备电脑与电脑之间的多端互控功能,您能够随时随地畅玩游戏,享受无缝的游戏体验。此外,远程看看…

【Linux网络】认识协议(TCP/UDP)、Mac/IP地址和端口号、网络字节序、socket套接字

⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 1、初识协议2、UDP、TCP3、Mac、IP地址4、端口号5、网络字节序6、socket 1、初识协议 协议就是一种约定。如何让不同厂商生产的计…

【软考知识】奇偶校验码,循环冗余码,海明码介绍

文章目录 **1. 奇偶校验码 (Parity Check Code)****基本原理****算法流程****优点与缺点****应用场景** **2. 循环冗余码 (Cyclic Redundancy Check, CRC)****基本原理****算法流程****例子****优点与缺点****应用场景** **3. 海明码 (Hamming Code)****基本原理****算法流程**…

前端面试-网络协议篇

1.http网络协议中post和get有什么区别 在HTTP网络协议中,POST和GET主要有以下区别: 参数传递方式: GET:参数附加在URL后面,如example.com?key1value1&key2value2 。POST:参数放在HTTP请求体中。 数据…

1.1 go环境搭建及基本使用

golang下载地址: Download and install - The Go Programming Language (google.cn) 验证安装是否成功: go version 查看go环境 go env 注意:Go1.11版本之后无需手动配置环境变量,使用go mod 管理项目,也不需要把项目放到GO…

Gemini 2.0助力科学突破,AI联合科学家系统登场

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

京东外卖骑手全部缴纳五险一金

刘强东这步棋,直击700万骑手软肋? 今天,京东突然甩出一张底牌:自2025年3月1日起,外卖全职骑手全员缴纳五险一金,兼职骑手配套意外医疗双保险。 消息一出,直接炸了外卖江湖。要知道&#xff0c…

百度云DeepSeek一体机:百舸、千帆和一见介绍及区别对比

百度智能云DeepSeek一体机百舸、千帆和一见,搭载昆仑芯等国产自研算力芯片,可支持在单机环境下一键部署DeepSeek R1/V3全系列模型。百度云服务器网bdyfwq.com分享百度智能云官方发布的百舸DeepSeek一体机、千帆DeepSeek一体机和一见DeepSeek一体机配置介…

【算法】直接插入排序、折半插入排序、希尔排序

1 直接插入排序 时间复杂度:O(N^2) 空间复杂度:O(1) 稳定性:稳定 元素集合越接近有序,直接插入排序算法的时间效率越高 1.1直接插入排序思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff…

使用API有效率地管理Dynadot域名,为域名部署DNS安全拓展(DNSSEC)

关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…

【排版教程】如何在Word/WPS中优雅的插入参考文献

材料展示 随便选取一段综述内容,以及对应的参考文献,如下图所示: 1 参考文献编辑 首先对参考文献部分进行编辑,将其设置自动编号 在段落中,选择悬挂缩进 在编号中,设置自定义编号,然后按照…

神经形态视觉的实时动态避障系统:突破传统SLAM的响应延迟瓶颈

引言:机器人感知的实时性挑战 斯坦福机器人实验室采用异步脉冲神经网络处理DVS事件相机数据后,动态障碍物响应延迟从34ms降至0.9ms。在20m复杂场景避障测试中,基于神经形态芯片的路径规划系统将SLAM更新频率提升至10kHz,较传统GP…

Linux操作系统4-进程间通信5(共享内存实现两个进程通信)

上篇文章:Linux操作系统4-进程间通信4(共享内存原理,创建,查看,命令)-CSDN博客 本篇Gitee仓库:myLerningCode/l24 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 本篇重…

RFID测温技术:电力设备安全监测的新利器

在当今高度依赖电力的现代化社会中,稳定且可靠的电力供应是社会运转的基石。电力设备作为电力系统的关键核心,其运行状态直接关乎电力供应的品质。然而,电力设备长期运行过程中,受到诸如过载、接触不良以及环境因素等多重影响&…

(一)趣学设计模式 之 单例模式!

目录 一、啥是单例模式?二、为什么要用单例模式?三、单例模式怎么实现?1. 饿汉式:先下手为强! 😈2. 懒汉式:用的时候再创建! 😴3. 枚举:最简单最安全的单例&a…

自动化办公|xlwings生成图表

在日常的数据分析和报告生成中,Excel图表是一个非常重要的工具。它能够帮助我们直观地展示数据,发现数据中的规律和趋势。然而,手动创建和调整图表往往耗时且容易出错。幸运的是,借助Python的xlwings库,我们可以自动化…