Spring源码整体脉络介绍及源码编译

news2024/10/6 0:27:18

需完成的任务

在这里插入图片描述

类------------------------------------------BeanFactory----------------------------------------->Bean【BeanFactory调用getBean()生产出来的】

BeanFactory

Spring顶层核心接口,使用了简单工厂模式【根据名字,生产出不同的Bean实例】

BeanDefinitionReader:读取xml或者注解的信息
BeanDefinitionScanner:负责扫描筛选有加Bean注解的类【不是所有的类都配置了Bean】
BeanDefinitionRegistry:负责将Bean的所有信息打包到BeanDefinition中供生产,加入到BeanDefinitionMap中

BeanFactory和ApplicationContxet的区别

都有生产Bean的能力,其中ApplicationContxet是调用BeanFactory实现的
ApplicationContxet实现了BeanFactory
BeanFactory:只有一个职责就是生产Bean
ApplicationContxet:实现了AOP、国际化,事件,扫描器、读取器其他接口等等 还有扩展节点,如BeanFactoryPostprocessor【用于集成其他组件如mybatis】等

在这里插入图片描述

Bean的生命周期/加载过程

实例化【反射】
填充属性【@Autowire@Value】
初始化
初始化的时候还要调用各种Aware方法
put到一个Map里存起来【Map<beanname,value>
最终getBean就是从Map中获取【就是单例池或者一级缓存】

Bean生命周期

在这里插入图片描述

扩展接口BeanFactoryPostProcessor【Bean工厂的后置处理器】

主要用于在调用getBean()方法之前修改Bean定义
BeanFactoryPostprocessor还有实现类BeanFactoryRegistryPostProcessor用来注册,所以这两个扩展点十分重要

BeanPostProcessor

Bean的后置处理器
Bean的实例化的时候每个步骤前前后后都会调用BeanPostProcessor【总共会调用九次】
在这里插入图片描述
Bean的生命周期的初始化后进行BeanPostProcessor实现AOP功能【为了跟Bean彻底解耦】

Ioc容器加载过程-Bean的生命周期深度剖析

以加载类为例
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

第一步

调用父类GenericApplicationContext的构造方法,第一步拿到Bean工厂
在这里插入图片描述
父子类继承关系
在这里插入图片描述
回到this()中,AnnotationConfigApplicationContext()构造方法,创建读取Bean定义
在这里插入图片描述
在此注册了一些处理器类,如星1解析@ComponentScan等注解
在这里插入图片描述

this总结1:

无参函数里面的this():总共三大步

  1. 加载Bean工厂,实例化一个Bean工厂
  2. 通过AnnotationBeanDefinitionReader注册了很多创世纪的处理器用来支撑AnnotationConfigApplicationContext后面的运行
  3. AnnotationConfigApplicationContext里还实例化Scanner用于扫描【类路径下的Bean定义扫描器】
    在这里插入图片描述

第二步

注册我们的配置类到Bean定义里面

在这里插入图片描述

第三步:IOC容器刷新接口refresh()

Spring中最核心的方法,体现SpringIOC的生命周期
里面有加载Bean到销毁Bean的整个过程,都在这个方法里体现了,主要体现在里面的十三个方法
这里不作全部深入,着重几个

第一个

调用相应的Bean工厂后置处理器,实例化创世纪的类,用来解析相应注解,将生成相应的Bean到Map中
在这里插入图片描述

第二个

循环所有的Bean定义,注册成最终的Bean存放到单例池中
在这里插入图片描述

BeanFactory和FactoryBean的区别

BeanFactory顶层的核心接口,使用简单的工厂模式,负责生产Bean
FactoryBean专门用来修饰普通Bean,如果普通Bean实现FactoryBean,那么就要实现FactoryBean里面的方法getObject(),当调用getBean()时,调用的是getObject()方法里的,成为特殊的一个Bean,前置&符号即可获取原来的值
在这里插入图片描述

总结流程

  1. 实例化AnnotiationConfigApplicationContxet,会做几件事:实例化Reader来加载一些创世纪的类【创世纪类里面有解析一些注解,其中最重要的是解析配置类的处理器ConfigurationClassPostProcessor】,然后实例化Sanner,实例化Registry【由BeanFactory的实现类实现】,执行完这两部类还没解析成Bean定义,只是把后续的一些类给准备好这些后置处理器实现了BeanFactoryPostProcssor接口,实现这个接口,就会在refresh()方法的invokeBeanFactoryPostProcessor(),在这里会调用所有实现BeanFactoryPostProcssor接口的Bean定义从而解析配置类,注册成Bean定义
  2. 执行完invokeBeanFactoryPostProcessor()我们的Bean定义就注册好了,注册好之后就会调用finishBeanFactoryInitiaization()实例化我们所有剩余的单例,从我们的Bean定义注册成我们的Bean
  3. getBean()会做哪些事情:判断Bean是否符合生产标准;判断是不是FactoryBean,先从一级缓存中拿
  4. 如果一级缓存有的话直接返回,没有的话进入下一步
  5. 一级缓存没有的话就给它标记正在创建以解决循环依赖,再调用doCreateBean()方法进行真正的创建,在这个过程当中会调用好多的Bean后置处理器

在这里插入图片描述

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

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

相关文章

【MR】搭建 Vision Pro App 开发环境

2023 年 6 月 21 日&#xff0c;Apple 发布 Xcode 15 Beta 2&#xff0c;包含了初代版本的 visionOS 1 beta&#xff0c;标志着苹果正式发布 Vsion Pro 的 SDK。 一、安装 Xcode 15 Beta 2 官网下载&#xff0c;需要 MacOS > 13.4 可以不选 visionOS 1 beta&#xff0c;直接…

ubuntu系统linux下安装指定版本的gcc方法

1:查看当前linux系统的gcc版本 gcc -v2&#xff1a;查看和cuda版本对应的gcc版本 3&#xff1a;安装和cuda对应版本的gcc MAX_GCC_VERSION8 sudo apt install gcc-$MAX_GCC_VERSION g-$MAX_GCC_VERSION4&#xff1a;建立gcc和cuda的软链接 sudo ln -s /usr/bin/gcc-$MAX_GC…

分布式监控系统zabbix应用

文章目录 一、zabbix简介1.1 什么是zabbix1.2 zabbix 监控原理&#xff1a;1.3 Zabbix 6.0 新特性&#xff1a;1.4 Zabbix 6.0 功能组件&#xff1a; 二、部署 zabbix 服务端1.3 部署数据库&#xff08;要求 MySQL 5.7 或 Mariadb 10.5 及以上版本&#xff09;1.4 编译安装 zab…

PHPExcel7.4数据导入很容易跳的坑

数据导入插入数据表很容易跳的坑 1&#xff1a;数据表有id并且是自增的&#xff0c;唯一的&#xff0c;这时候excel表格里面也有id&#xff0c;所以导致添加报错&#xff0c; 解决方法&#xff0c;把excel表格的字段名id换成名称_id&#xff0c;或者修改数据表 2.excel有年月…

飞书接入机器人NODE开发自动回复

一、创建飞书应用 1.登录飞书开放平台 进入开发者后台 创建自建应用 2.添加应用能力 选择机器人添加 3.添加事件订阅并根据权限开通权限 此处只添加获取消息事件 4.配置应用服务端地址&#xff08;当事件触发 会触发设置的地址 并发送事件数据&#xff09;开启Encrypt Key 实…

简要介绍 | 元学习:学会学习的新途径

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对元学习&#xff08;Meta-Learning&#xff09;进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 元学习&#xff1a;学会学习的新途径 BLOG | Samsung Research 1 背景介绍 元学习&#xff08;…

Linux基础工具|C/C++编译器:gcc/g++的使用

1.基础使用 gcc是专门用来编译C语言的编译器&#xff0c;而g是编译C的编译器&#xff08;也可以编译C语言&#xff0c;毕竟C语言兼容C&#xff09;。Linux下gcc默认使用8字节的指针。 下载安装&#xff1a;gcc的安装指令“sudo yum install gcc”&#xff08;在Linux里大部分…

【C++】详解set和map

目录 一、什么是关联式容器及树形结构的关联式容器二、键值对三、set1、什么是set2、set的使用1&#xff09;set的模版参数列表2&#xff09;set的构造3&#xff09;set的迭代器4&#xff09;set的容量5&#xff09;set的修改操作 3、multiset的介绍及使用 四、map1、什么是map…

vue3怎么把路由的 # 去掉 ? 为什么用mode: ‘history‘没有生效?

代码完成后 请重启项目 一定要重启&#xff01; 重启&#xff01;重启&#xff01; &#xff08;没重启项目不生效&#xff09; 1.找到项目中的路由文件 2.引用vueRouter // vue3 import { createRouter, createWebHistory } from "vue-router";var router crea…

C# 交错数组学习

C# 交错数组是元素为数组的数组。 一个示例&#xff1b; using System;class Program {static void Main(string[] args) {string[][] weeks new string[3][];weeks[0] new string[] { "星期日", "星期一", "星期二", "星期三", &…

R语言学习——线性拟合、检查正态分布、秩和检验、百分比检验、卡方检验、方差检验

test <- read.table(/Users/zhangzhishuai/Downloads/20 lesson20 R相关性检验及线性拟合/BMI.txt, sep \t, header T,row.names 1) test plot(test$weight,test$height) cor(test$weight,test$height) cor.test(test$weight,test$height)# 线性拟合 result lm(height~w…

6月《中国数据库行业分析报告》已发布,首发空间、搜索引擎数据库【全球产业图谱】

为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况&#xff0c;从2022年4月起&#xff0c;墨天轮社区行业分析研究团队出品将持续每月为大家推出最新《中国数据库行业分析报告》&#xff0c;持续传播数据技术知识、努力促进技术创新与行业生…

Python 简易表格数据处理CSV+XLS+XLSX

概述 在实际应用中我们进行数据处理与分析时&#xff0c;往往涉及大量的表格。一般来说&#xff0c;使用Python的专业数据分析处理工具包&#xff0c;完全可以胜任我们的大多数需求&#xff0c;比如NumpyPandas。但是有时候往往我们对表格数据的操作是很简单的&#xff0c;不需…

git常用记录

一些日常使用记录 常用命令 切换分支 在git checkout 分支名查看分支 git branch -r git branch -a //查看所有分支包括本地分支和远程分支合并分支 git merge 来源分支删除分支 git branch -D 分支名 //删除本地分支 git push origin --delete 分支名 //删除远程分支本…

ES6新特性总结

最近&#xff0c;在面试中也是经常被问道ES6关于新特性的面试题&#xff0c;那我也来个总结&#xff0c;记录下。 ES6新特性总结 let、const命令&#xff08;1&#xff09;let&#xff08;2&#xff09;const 模板字符串增强的函数&#xff08;1&#xff09;函数的参数可以设置…

6.4.4 GLSL实现奶牛颜色动态变化

#include <osg/Program> #include <osgDB/ReadFile> #include <osgViewer/Viewer>static const char* vertSource {"varying vec3 normal;\n"//易变量 用于着色器之间的传值"void main()\n""{\n"" normal normalize…

Kscan-简单的资产测绘工具

下载地址&#xff1a;https://github.com/lcvvvv/kscan 简介 &#xff1a; Kscan是一款纯go开发的全方位扫描器&#xff0c;具备端口扫描、协议检测、指纹识别&#xff0c;暴力破解等功能。支持协议1200&#xff0c;协议指纹10000&#xff0c;应用指纹20000&#xff0c;暴力破…

UNI-APP_subNVue原生子窗口使用,web-view层级问题解决

subNVues文档 app-subnvues文档 subNVues开发指南 需求&#xff1a;在pages/cloud_control/index页面使用subNVue原生子窗口 1.pages文件配置 "app-plus": {"bounce": "none","subNVues":[{"id": "control_popup&qu…

Mongodb基础及应用、部署(超详细)

目录 一、简介 二、应用场景 三、概念 四、安装部署 1、关闭防火墙和selinux 2、指定一个进程同一时间最多可开启的文件数 3、用户最多可开启的进程数目 4、安装版本下载地址 5、创建数据目录&#xff0c;日志文件及目录并创建相应配置文件 6、启动MongoDB数据库&#xff0c…

接口自动化你一定能要知道的基本流程和测试思路

接口自动化大致步骤&#xff1a; 1、发送请求 2、解析结果 3、验证结果 定义三个和业务相关的类 1、一个用来封装HTTPclient&#xff0c;用来发送请求 2、解析结果xml的类 3、一个用于比较测试结果和期望值的类&#xff0c;用于验证 4、自动生成报告的类&#xff1a;自…