当前位置: 首页 > news >正文

深入Spring底层透析Bean创建过程之拨云见日篇

目录

  • 前言
  • 一.BeanFactory快速入门
    • 1. BeanFactory创建Bean
    • 2. BeanFactory和ApplicationContext的关系
    • 3. 和ApplicationContext区别(高频问点)
    • 4. BeanFactory的继承体系
    • 5. ApplicationContext的继承体系
  • 二.Bean实例化的基本流程(重点)

前言

首先感谢您的阅览,文章部分有个人思考与总结,难免会有遗漏之处,如有错误欢迎指正与补充,最后也希望您也能有所收获


一.BeanFactory快速入门

1. BeanFactory创建Bean

在这里插入图片描述
IOC控制反转,反转的是bean的创建权

结合上图有以下步骤:

1)导入Spring的jar包或Maven坐标;
2)定义UserService接口及其UserServiceImpl实现类;
3)创建beans.xml配置文件,将UserServiceImpl的信息配置到该xml中;
4)编写测试代码,创建BeanFactory,加载配置文件,获取UserService实例对象。


下面是用BeanFactory创建bean步骤

在这里插入图片描述

看到上面的创建过程是不是很熟悉,对只是比平时用ApplicationContext多一步而已,多了创建工厂对象,可以看到上图创建bean过程还是比较麻烦的,所以后面的ApplicationContext将其封装了,最后简化如下

在这里插入图片描述

可以看一下二者的关系(快捷键 CTRL + alt + u)

在这里插入图片描述


2. BeanFactory和ApplicationContext的关系

在这里插入图片描述

它是ApplicationContext的父接口
是Spring的核心容器,主要的ApplicationContext实现都组合了它的功能(BeanFactory实际上是ApplicationContext的成员变量


3. 和ApplicationContext区别(高频问点)

ApplicationContext(应用上下文)Spring的容器,其实它底层调用bean的操作还都是BeanFactory的。ApplicationContext内部封装了BeanFactory,比BeanFactory功能更丰富更强大

BeanFactory与ApplicationContext的区别

1)BeanFactory是Spring的早期接口,称为Spring的Bean工厂,ApplicationContext是后期更高级接口,称之为Spring 容器;

2)ApplicationContext在BeanFactory基础上对功能进行了扩展,例如:监听功能、国际化功能等。BeanFactory的API更偏向底层,ApplicationContext的API大多数是对这些底层API的封装;

3)Bean创建的主要逻辑和功能都被封装在BeanFactory中,ApplicationContext不仅继承了BeanFactory,而且ApplicationContext内部还维护着BeanFactory的引用,所以,ApplicationContext与BeanFactory既有继承关系,又有融合关系。

4)Bean的初始化时机不同,一个延迟加载,一个立即加载。原始BeanFactory是在首次调用getBean时才进行Bean的创建,而ApplicationContext则是配置文件加载,容器一创建就将Bean都实例化并初始化好。

在这里插入图片描述


4. BeanFactory的继承体系

BeanFactory是核心接口,项目运行过程中肯定有具体实现参与,这个具体实现就是DefaultListableBeanFactory,而ApplicationContext内部维护的Beanfactory的实现类也是它


在这里插入图片描述


5. ApplicationContext的继承体系

只在Spring基础环境下,即只导入spring-context坐标时,此时ApplicationContext的继承体系

在这里插入图片描述

spring环境下常用的三个ApplicationContext作用如下:

在这里插入图片描述


二.Bean实例化的基本流程(重点)

bean的实例化总共以下5步,看明白了可以说是拨云见日,前后知识点都能衔接

①Spring容器在进行初始化时,会将xml配置的的信息注意此时封装的不是对象,而是xml中对象配置的信息比如属性之类)封装成一个BeanDefinition对象(bean定义对象)
封装的是bean标签也就是下面这样的
在这里插入图片描述


②将所有的BeanDefinition存储到一个名为beanDefinitionMap的Map集合中去,Spring框架再对该Map进行遍历,取出每个BeanDefinition对象,拿到BeanDefinition内部封装的信息,主要是拿bean的类名(因为后面要根据反射来创建bean对象的,反射忘记了可以看看这篇:Java反射使用介绍)
在这里插入图片描述

你想知道beanDefinitionMap的Map集合是什么吗,我在翻源码时看到了它的位置,也就是DefaultListableBeanFactory中定义的一个map集合,转专门存放bean标签对象的,而DefaultListableBeanFactory又是BeanFactory的实现类,就是在BeanFactory中维护,所以你应该懂了吧。


③使用反射创建Bean实例对象


④创建好的Bean对象存储在一个名为singletonObjects(单例池,也在BeanFactory中维护)的Map集合中


⑤当调用getBean方法最终从该Map集合中取出Bean实例对象返回


最后断点调试验证说明

在这里插入图片描述

在这里插入图片描述

所以说,beanDefinitionMap和singletonObjects都是在beanFactory中维护的

最后这个bean创建的基本流程可以总结为下图,后续扩展功能也是在下图中不断扩容

在这里插入图片描述


相关文章:

深入Spring底层透析Bean创建过程之拨云见日篇

目录前言一.BeanFactory快速入门1. BeanFactory创建Bean2. BeanFactory和ApplicationContext的关系3. 和ApplicationContext区别(高频问点)4. BeanFactory的继承体系5. ApplicationContext的继承体系二.Bean实例化的基本流程(重点)前言 首先感谢您的阅览&#xff0…...

8 狗监控的封装

概述 为了保证嵌入式程序能够长时间稳定地运行,需要加入狗监控机制。狗监控的原理为:应用程序需要每隔一段时间来喂狗或保活,如果应用程序崩溃或者内核崩溃,导致长时间无法喂狗,则狗将超时,会自动重启系统。部分IPC芯片提供了硬件狗,对于没有硬件狗的,需要自行实现软件…...

基于卷积神经网络图像风格迁移系统的设计与实现(flask系统)

1.摘要 Leon Gatys 等人研发的深度神经网络使用神经的表达来分离任意图片的内容和风格,为生成艺术图片提供一个神经算法。本文基于Style Transfer算法,使用风格成本函数训练CNN,用卷积神经网络提取图像特征,依次提取内容图像的内…...

【1】linux命令每日分享——mkdir

大家好,这里是sdust-vrlab,Linux是一种免费使用和自由传播的类UNIX操作系统,Linux的基本思想有两点:一切都是文件;每个文件都有确定的用途;linux涉及到IT行业的方方面面,在我们日常的学习中&…...

实例2:树莓派GPIO控制外部LED灯闪烁

实例2:树莓派GPIO控制外部LED灯闪烁 实验目的 通过背景知识学习,了解四足机器人mini pupper搭载的微型控制计算机:树莓派。通过树莓派GPIO操作的学习,熟悉GPIO的读写控制。通过外部LED灯的亮灭控制,熟悉树莓派对外界…...

详解可变形注意力模块(Deformable Attention Module)

Deformable Attention(可变形注意力)首先在2020年10月初商汤研究院的《Deformable DETR: Deformable Transformers for End-to-End Object Detection》论文中提出,在2022CVPR中《Vision Transformer with Deformable Attention》提出应用了De…...

Java数据结构中链表分割及链表排序使用快速排序、归并排序、集合排序、迭代、递归,刷题的重点总结

本篇主要介绍在单链表进行分割,单链表进行分隔并使用快速排序、归并排序、集合排序、迭代、递归等方法的总结,愿各位大佬喜欢~~ 86. 分隔链表 - 力扣(LeetCode) 148. 排序链表 - 力扣(LeetCode) 目录 一…...

音视频基础之音频编码原理简介

一:隐蔽信号 数字音频信号如果不加压缩地直接进行传送,将会占用极大的带宽。例如,一套双声道数字音频若取样频率为44.1KHz,每样值按16bit量化,则其码率为: 244.1kHz16bit1.411Mbit/s 如此大的带宽将给信号…...

【Python--XML文件读写】XML文件读写详解

【Python–XML文件读写】XML文件读写详解 文章目录【Python--XML文件读写】XML文件读写详解1. 前言1.1 介绍1.2 用法2. xml文件内容形式3. xml文件读写3.1 项目框架3.1 写入操作(创建)(create_xml.py)3.2 读取操作(解析…...

GNU make 中文手册 第一二章 概述与介绍

一、第一章:概述 准备知识 在开始我们关于 make 的讨论之前,首先需要明确一些基本概念: 编译:把高级语言书写的代码,转换为机器可识别的机器指令。编译高级语言后生成的指令虽然可被机器识别,但是还不能…...

真的了解HashMap、HashSet吗?做一道测试题试试!

本人博客《HashMap、HashSet底层原理分析》,可以了解hashmap的底层源码实现 测试代码 HashSet底层实际就是一个Hashmap。猜猜下面源码每一个打印结果。 注:user对象重写的hashcode方法,保证name和age一样的情况下hashcode是一样的&#xff…...

树莓派下安装OpenEuler

openEuler作为华为开源的应用于嵌入式设备的操作系统,正在受到越来越多的关注。树莓派是一个很好的应用场景,这篇文章就介绍下如何在树莓派上安装openEuler。   ps:openEuler要求树莓派的版本是4B 1.下载openEuler镜像 镜像网址&#xff1…...

VSCode Remote-SSH配置免密登录踩坑

VSCode Remote-SSH配置免密登录踩坑1. 参考2. 基本流程2.1 机器A(Windows客户端)2.2 机器B(Linux服务器)2.3 机器A(Windows客户端)的VSCode设置3. 踩坑总结相关教程很多,但要么冗余,…...

【Python语言基础】——Python NumPy 数组拆分

Python语言基础——Python NumPy 数组拆分 文章目录 Python语言基础——Python NumPy 数组拆分一、Python NumPy 数组拆分一、Python NumPy 数组拆分 拆分 NumPy 数组 拆分是连接的反向操作。 连接(Joining)是将多个数组合并为一个,拆分(Spliting)将一个数组拆分为多个。…...

虹科资讯| 虹科AR荣获汽车后市场“20佳”维修工具评委会提名奖!

2022 虹科荣获20佳维修工具 评委会提名奖 特大喜讯,在2月16日《汽车维修与保养》杂志主办的第十八届汽车后市场“20佳”评选活动中,虹科的产品“M400智能AR眼镜”凭借在AR领域的专业实力,通过层层筛选,在102款入围产品中脱颖而出…...

Mysql架构与内部模块

Mysql架构与内部模块 演示环境: MySQL 5.7 存储引擎:InnoDB 一、一条查询SQL是如何执行的? 程序或者工具要操作数据库,第一步跟数据库建立连接。 1、通信协议 首先,MySQL 必须要运行一个服务,监听默认的…...

从技术上来看,互联网技术开始衍生和蜕变出更多的新技术

很多人在看待产业互联网的问题上,一味地割裂它与互联网之间的联系,甚至还有人将产业互联网看成是对于传统互联网的颠覆。如果仅仅只是以这样的眼光来看待产业互联网,那么,他们势必是无法完整把握产业互联网的本质内涵和原始奥义的…...

最长不含重复字符的子字符串

今天处理一道算法题目,《剑指Offer》第48题,力扣中等题。 这道题也是面试的高频题! 题目描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例1: 输入: "abcabcbb" …...

git中git push origin master推送远程操作失败,报错解决方案

报错图片如下所示: 解决方案: 使用下面代码进行本地与远程仓库的链接: git remote add origin http://xxxxx///xxx(https://gitee.com/peach-fog/shopping-cart-car-warehouse.git)链接完成之后就会输出:fatal: remote origin already exists. 链接完成之后就需要使用git br…...

服务器部署流程与经验记录

服务器部署流程1.项目部署1.1 重置实例密码1.2 配置安全组规则1.3 远程连接服务器1.4 安装所需软件1.5 安装Tomcat1.6 配置宝塔安全组1.7 导入数据库和项目2. 域名注册3. 网站备案1.项目部署 1.1 重置实例密码 1.2 配置安全组规则 1.3 远程连接服务器 使用VNC远程连接&#…...

无障碍阅读助手:OpenClaw+Phi-3-vision-128k-instruct实时解析复杂图表

无障碍阅读助手:OpenClawPhi-3-vision-128k-instruct实时解析复杂图表 1. 为什么需要图表无障碍解析工具 去年帮一位视障朋友准备资格考试时,我深刻体会到技术文档中的图表是如何成为"信息黑洞"的。当他用屏幕阅读器听到"参见图3"…...

OpenClaw浏览器自动化:Qwen3-14b_int4_awq驱动网页检索与数据抓取

OpenClaw浏览器自动化:Qwen3-14b_int4_awq驱动网页检索与数据抓取 1. 为什么需要浏览器自动化助手 作为一个经常需要收集行业动态的技术博主,我每天要花大量时间在不同网站间切换、搜索关键词、复制粘贴数据。这种重复劳动不仅效率低下,还容…...

5个技巧让你高效畅玩Switch游戏:开源Ryujinx模拟器全攻略

5个技巧让你高效畅玩Switch游戏:开源Ryujinx模拟器全攻略 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx Ryujinx是一款采用C#语言开发的开源Nintendo Switch模拟器&#x…...

微服务七大核心组件详解:搞懂架构运行底层逻辑

从实战视角拆解微服务架构的"五脏六腑",掌握每个组件的设计哲学与落地细节一、为什么需要这七大组件? 微服务架构的本质是分布式系统的工程化实践。当单体应用拆分为数十个甚至上百个独立服务后,我们面临的核心挑战:挑战…...

别只盯着TCP!拆解大疆源码里MQTT协议的双通道设计:BASIC与DRC到底有啥区别?

大疆源码中的MQTT双通道设计:BASIC与DRC的工程哲学 在分析大疆无人机开源项目的通信架构时,一个有趣的设计选择跃然眼前——MQTT协议同时运行在TCP和WebSocket两种传输层上。这种看似冗余的配置背后,隐藏着对物联网通信场景的深刻理解。本文将…...

零基础快速入门前端蓝桥杯真题速刷2451.灯的颜色变化(助力保底拿奖不捐款)深入掌握 DOM 选择器与定时器:从交通灯案例到蓝桥杯 Web 考点全解 将原题目扩展成交通灯

2451.灯的颜色变化深入掌握 DOM 选择器与定时器:从交通灯案例到蓝桥杯 Web 考点全解在蓝桥杯 Web 方向竞赛中,DOM 操作与定时器控制是高频考点。本文以一个经典的交通灯控制案例为切入点,全面解析 document.querySelector 的 ID/Class 选择语…...

AMD Ryzen终极调试工具:5步掌握硬件级性能优化

AMD Ryzen终极调试工具:5步掌握硬件级性能优化 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcode.c…...

Scratch 3.0二次开发实战:从零构建自定义插件

1. 为什么需要自定义Scratch插件? Scratch作为全球最受欢迎的少儿编程工具,其模块化积木设计让编程学习变得直观有趣。但你可能遇到过这种情况:想做一个天气预报项目,却发现内置积木无法获取实时天气数据;或者想开发一…...

高光谱成像的噪声估计

1. 差分类方法(Difference-based Methods)# 差分类方法的核心思想是:利用邻域像素之间的差值来削弱真实信号,从而突出噪声成分。 展开来说,在自然图像或高光谱图像中,真实信号通常具有一定的空间连续性&am…...

OpenClaw进阶配置:千问3.5-9B模型参数调优全解析

OpenClaw进阶配置:千问3.5-9B模型参数调优全解析 1. 为什么需要调优模型参数? 上周我在用OpenClaw自动处理一批技术文档时遇到了奇怪的现象:同样的任务指令,有时能完美执行,有时却会漏掉关键步骤。经过两天排查&…...