Spring源码解析-总览

1、前言

 Spring源码一直贯穿我们Java的开发中,只要你是一个Java开发人员就一定知道Spring全家桶。Spring全家桶为我们一共一站式服务,IOC、AOP更是Spring显著特性。但是Spring到底怎么为我们提供容器,管理资源的呢?下来,我们将一步步探究Spring源码内幕。本章节主要讲述Spring源码的概述。

2、总览图

微信图片_20230831161810.png

总览图中,主要通过注解的方式探索整个源码的流程,这也是程序的入口。主要包括三个类:
  • FileSystemXmlApplicationContext

  • ClassPathXmlApplicationContext xml配置方式

  • AnnotationConfigApplicationContext 注解配置的方式

其中,AnnotationConfigApplicationContext 又分为三个大部分:

  • this() 构造函数, 构建注解需要的读取注解需要的xxxReaderxxxScanner

  • register() 注册注解需要的配置类

  • refresh() 核心流程,也是所有Spring的核心关键点

refresh 是整个Spring生产Bean对象的关键流程,管理这Bean的生命周期。

  • 加载配置文件

  • 解析文件内容

  • 装载生成Bean所需要的所有定义信息

  • 初始化Bean对象

  • 填充Bean对象的属性

  • Bean对象的后置处理

最终完成Bean对象的创建,其中使用三级缓存解决循环依赖的问题、扩展接口的加载与调用、aop的处理等一系列的操作。

3、整体流程示意图

Spring的启动流程.png

整体的流程大致也是reflesh的流程。加载、解析、扩展、实例化、初始化的过程。这是Spring为我们管理Bean的生命周期,同时IOC依赖注入的整个过程。

4、关键类的认识

4.1 BeanFactory

BeanFactory 是Spring框架中一个核心接口,主要用来管理和提供程序应用的Bean,管理这Bean的整个生命周期。主要作用如下:

  • Bean创建和实例化

  • Bean依赖注入

  • Bean生命周期的管理

  • Bean的获取和查找

通过BeanFactory,我们也可以窥探一二。

4.2 FactoryBean

FactoryBean 同样也是用来创建Bean,但是FactoryBean 不必须严格遵守Bean的生命周期,用户可以快捷的创建Bean对象,从而被Spring管理。

  • 通过getObject()方法获取Bean对象

  • 还可以通过& + 名称 获取FactoryBean 本身。

  • actoryBean可以用于装饰和增强对象。通过在getObject()方法中对实际对象进行包装或增强,可以在对象创建过程中添加额外的逻辑或功能。

4.3 DefaultListableBeanFactory

BeanFactory 的默认实现类。不指定的情况下,我们所说的BeanFactory 就是 DefaultListableBeanFactory 本尊。

4.4 RootBeanDefinition

RootBeanDefinition 封装的Bean的所有定义信息,也是Bean对象创建的核心。也是Bean父子类定义信息的合并。

4.5 BeanFactoryPostProcessor

BeanFactoryPostProcessor Bean工厂的后置处理器,也是一个钩子方法。可以修改Bean工厂的Bean属性值。

BeanFactoryPostProcessor 是在加载Bean定义之后,实例化之前对Bean的定义进行修改。这些修改可以包括添加新的属性值、更改属性值或者删除属性值等。这个过程发生在Bean的实例化之前,因此对Bean的定义进行的任何修改都会影响到后续的Bean实例化过程。

4.6 BeanPostProcessor

BeanPostProcessor 是在Bean的实例化之后但在依赖注入之前对Bean进行定制化处理。这个过程发生在Bean的依赖注入之前,因此可以在这个阶段对Bean进行一些额外的处理,例如初始化、属性注入等。

5、后记

因为对框架的不断深入学习,后续还会不断完善各章节的内容。

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

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

相关文章

MyBatis 中如何实现分页 ?

1. MyBatis 中如何实现分页 &#xff1f; MyBatis 中的分页有两种实现方式&#xff1a;物理分页 or 逻辑分页 【物理分页】 1.1 原生 SQL 物理分页 物理分页是通过 SQL 查询语句&#xff0c;LIMIT 语法进行分页的&#xff0c;它是在数据库引擎层面实现的。 <select id&…

Ubuntu学习---跟着绍发学linux课程记录(第二部分)

文章目录 7 文件权限7.1 文件的权限7.2 修改文件权限7.3 修改文件的属主 8、可执行脚本8.2Shell脚本8.3python脚本的创建 9Shell9.1Shell中的变量9.2 环境变量9.3用户环境变量 学习链接: Ubuntu 21.04乌班图 Linux使用教程_60集Linux课程 所有资料在 http://afanihao.cn/java …

学生管理系统VueAjax版本

学生管理系统VueAjax版本 使用Vue和Ajax对原有学生管理系统进行优化 1.准备工作 创建AjaxResult类&#xff0c;对Ajax回传的信息封装在对象中 package com.grg.Result;/*** Author Grg* Date 2023/8/30 8:51* PackageName:com.grg.Result* ClassName: AjaxResult* Descript…

Docker进入容器出现bash: vi: command not found

&#x1f388;1 参考文档 docker基础容器中bash: vi: command not found问题解决 | 你邻座的怪同学 &#x1f50d;2 问题描述 在使用 Docker 容器时&#xff0c;有时候里边没有安装vim&#xff0c;敲vim命令时提示说&#xff1a;vim: command not found。 这个时候就需要安装v…

Java抛出异常

当某个方法抛出了异常时&#xff0c;如果当前方法没有捕获异常&#xff0c;异常就会被抛到上层调用方法&#xff0c;直到遇到某个try ... catch被捕获为止 调用printStackTrace()可以打印异常的传播栈&#xff0c;对于调试非常有用&#xff1b;捕获异常并再次抛出新的异常时&am…

项目-IM

tim-server tim-server启动类实现CommandLineRunner接口&#xff0c;重写run()方法 run()方法开启一个线程&#xff0c;创建zk持久父节点&#xff0c;创建临时顺序子节点&#xff0c;将netty-server信息写入 1.1 用户登录 1.2 gateway向认证授权中心请求token 1.3 从zookee…

在windows上安装Cmake软件

Cmake是一个跨语言、跨平台、开源的编译工具&#xff0c;可以编译C、C、Note.js、JavaScript、C#、Java、Python、Php、Object-C、Ruby等工程&#xff0c;需要设置对应的src源码目录、ext第三方依赖目录、CMakeList.txt构建列表&#xff0c;再使用cmake命令即可。     2023年…

程序员自由创业周记#2:前期准备

感恩 上次公开了创业的决定后&#xff0c;得到了很多亲朋好友和陌生朋友的鼓励或支持&#xff0c;以不同的形式&#xff0c;感动之情溢于言表。这些都会记在心里&#xff0c;大恩不言谢~ 创业方向 笔者是一名资质平平的iOS开发程序猿&#xff0c;创业项目也就是开发App卖&am…

Jmeter(二十九):Jmeter常用场景梳理

一、每秒钟固定调用次数 如果想控制每秒发送请求数量,仅仅通过线程数与循环次数是不够的,因为这只能控制发送总数,而要控制每秒发送数量,需要线程数与常数吞吐量控制器的搭配使用,这种场景在性能测试中使用不多。 例如每秒钟调用30次接口,那么把线程数设置为30,将常数…

Netty-ChannelPipeline

EventLoop可以说是 Netty 的调度中心&#xff0c;负责监听多种事件类型&#xff1a;I/O 事件、信号事件、定时事件等&#xff0c;然而实际的业务处理逻辑则是由 ChannelPipeline 中所定义的 ChannelHandler 完成的&#xff0c;ChannelPipeline 和 ChannelHandler应用开发的过程…

高教社杯数模竞赛特辑论文篇-2012年A题:葡萄酒的评价(附获奖论文)

目录 摘 要 一、问题重述 二、问题分析 2.1 问题一的分析 2.2 问题二的分析

SMT制造中的产品质量检验和管理

SMT制造中的质量检验和产品物料管理都是实现高质量、低成本、高效益的重要方法。在SMT加工的过程中&#xff0c;产品质量的检验和质量把控都是重中之重&#xff0c;可以有效的降低产品不良率及返修等造成制造成本升高的风险问题&#xff0c;今天就来跟大家讨论一下SMT制造中我们…

C语言(第三十三天)

3.1.2 画图推演 3.2 举例2&#xff1a;顺序打印一个整数的每一位 输入一个整数m&#xff0c;打印这个按照顺序打印整数的每一位。 比如&#xff1a; 输入&#xff1a;1234 输出&#xff1a;1 2 3 4 输入&#xff1a;520 输出&#xff1a;5 2 0 3.2.1 分析和代码实现 这个题目&a…

数据结构--队列与循环队列

队列 队列是什么&#xff0c;先联想一下队&#xff0c;排队先来的人排前面先出&#xff0c;后来的人排后面后出&#xff1b;队列的性质也一样&#xff0c;先进队列的数据先出&#xff0c;后进队列的后出&#xff1b;就像图一的样子&#xff1a; 图1 如图1&#xff0c;1号元素是…

Harbor查看密码

已经登录过的harbor 查看密码 cat /root/.docker/config.json {"auths": {"172.28.120.140": {"auth": "YWRtaW43QDIwMTg"}}使用base64解码

Router和Route

Router是一个Web框架中的组件&#xff0c;用于处理HTTP请求&#xff0c;并将其路由到相应的处理程序。在不同的Web框架中&#xff0c;Router的实现方式可能会有所不同&#xff0c;但通常都会包括以下几个部分&#xff1a; URL解析器&#xff1a;用于解析HTTP请求中的URL&#x…

CS420 课程笔记 P1 - 游戏逆向课程介绍

文章目录 笔记前言IntroductionPrerequisitesSkills you will learn Additional TopicsComputer ScienceUniversal ProcessDemystifying Computers 笔记前言 文章的标题根据油管自动生成进行分类&#xff0c;方便对应视频进行定位 笔记根据 Guided Hacking 发布的 CS420 课程完…

本地开机启动jar

1&#xff1a;首先有个可运行的jar包 本地以ruiyi代码为例打包 2&#xff1a;编写bat命令---命名为.bat即可 echo off java -jar D:\everyDay\test\RuoYi\target\RuoYi.jar 3&#xff1a;设置为开机自启动启动 快捷键winr----输入shell:startup---打开启动文档夹 把bat文件复…

春秋云镜 CVE-2018-16283

春秋云镜 CVE-2018-16283 WordPress Plugin Wechat Broadcast LFI 靶标介绍 WordPress Plugin Wechat Broadcast LFI 启动场景 漏洞利用 exp # Exploit Title: WordPress Plugin Wechat Broadcast 1.2.0 - Local File Inclusion # Author: Manuel Garcia Cardenas # Date:…

Spring boot 第一个程序

新建工程 选择spring-boot版本 右键创建类TestController&#xff1a; 代码如下&#xff1a; package com.example.demo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springf…