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

需完成的任务

在这里插入图片描述

类------------------------------------------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后置处理器

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#:AES的加密解密,用于明文加密

大白话理解&#xff1a;将明眼能看到的字符给用另一种读不懂的语言给翻译&#xff0c;就像是摩斯密码……就像base64加密&#xff0c;都有异曲同工之妙。 建一个新的类&#xff08;这里放了aes加密解密的方法&#xff09; public static class AesPassword{/// <summary&g…

大屏项目也不难

项目环境搭建 使用create-vue初始化项目 npm init vuelatest准备utils模块 业务背景&#xff1a;大屏项目属于后台项目的一个子项目&#xff0c;用户的token是共享的 后台项目 - token - cookie 大屏项目要以同样的方式把token获取到&#xff0c;然后拼接到axios的请求头中…

rain-nowcasting-using-deep-learning github:使用深度学习进行临近降水预报

来源 github地址 是什么 本资料库旨在阐述 "在应用于降雨预报的深度学习模型中合并雷达雨量图像和风速预测 "&#xff08; “Merging radar rain images and wind predictions in a deep learning model applied to rain nowcasting”&#xff09;一文中提出的深度…

群晖NAS搭建WebDV服务手机ES文件浏览器远程访问

文章目录 1. 安装启用WebDAV2. 安装cpolar3. 配置公网访问地址4. 公网测试连接5. 固定连接公网地址 转载自cpolar极点云文章&#xff1a;群晖NAS搭建WebDAV服务手机ES文件浏览器远程访问 有时候我们想通过移动设备访问群晖NAS 中的文件,以满足特殊需求,我们在群辉中开启WebDav服…

蓝桥杯专题-试题版含答案-【字母统计】【计算球体积】【16进制的简单运算】【C小加随机数】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

JUC--CompletableFuture下

对计算速度进行选用 import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit;public class Test4 {public static void main(String[] args) {CompletableFuture<String> a CompletableFuture.supplyAsync(() -> {try { TimeUnit.SE…

详解JAVA Socket

目录 1.概述 2.使用 3.使用场景 3.1.web server中的网络通信 3.2.长连接 3.3.性能问题 1.概述 什么是网络通信&#xff1a; 就像打电话一样&#xff0c;两点间要通信&#xff0c;两点间就必须有连接&#xff0c;为了实现任意两个节点之间的通信&#xff0c;我们就必须采…

第三十九章Java成员方法的声明和调用

声明成员方法可以定义类的行为&#xff0c;行为表示一个对象能够做的事情或者能够从一个对象取得的信息。类的各种功能操作都是用方法来实现的&#xff0c;属性只不过提供了相应的数据。一个完整的方法通常包括方法名称、方法主体、方法参数和方法返回值类型&#xff0c;其结构…

C# PaddleInference 文字检测(只检测不识别)

效果 项目 Demo下载 代码 using OpenCvSharp.Extensions; using OpenCvSharp; using Sdcb.PaddleInference.Native; using Sdcb.PaddleInference; using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Linq; using Sys…

phar协议文件包含

实验目的 通过本实验&#xff0c;了解php封装伪协议&#xff0c;掌握phar协议文件包含的用法 实验环境 操作机&#xff1a;kali 靶机&#xff1a;Windows 2007 实验地址&#xff1a;http://靶机ip/exp/include2/phar/phar1/ 用户名&#xff1a;college 密码&#xff1a;360C…

Vue :在 VSCode 中安装 yarn 并用 yarn 工具来控制 Vue 项目的详细过程

Ⅰ、 Yarn 工具简介&#xff1a; 1、什么是 yarn 工具: Yarn 是 facebook 发布的一款取代 npm 的资源包管理工具&#xff0c;是一个快速、可靠、安全的依赖管理工具&#xff0c;一款新的 JavaScript 资源包管理工具(吐槽下&#xff1a;最大的弊端是&#xff0c;要通过 npm 来…

在blender中使用python程序化建模

blender中&#xff0c;所有可以在Blender软件中的手动操作&#xff0c;基本都可以通过Python API 完成 那么就可以用这个完成程序化生成 下面我给出一个简单的方块建模程序&#xff1a; 在scripting中&#xff0c;可以添加file&#xff0c;然后向场景中心放置一个正方体 首…

RK3588平台开发系列讲解(Camera篇)OV569摄像头调试

文章目录 一、摄像头识别检测二、查看摄像头支持的格式三、摄像头采集格式查询四、摄像头采集格式查询沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要讲解OV569摄像头调试。 OV5695 是一种图像传感器,用于摄像头设备。要进行 OV5695 摄像头的调试,通常涉…

100种思维模型之能力圈思维模型-91

芒格说&#xff1a; “ 一个人在一生中可以真正得到的真见卓识仍然非常有限&#xff0c;所以正确的决策必须局限在自己的 ‘ 能力圈’ 以内。 ” 巴菲特说&#xff1a; “对你的 能力圈 来说&#xff0c;最重要的不是能力圈的范围大小&#xff0c;而是你如何能够 确定能…

Django核心

安装django pip install django # pip install django3.1.6创建django项目 在一个项目中可以包含多个应用程序。 django-admin startapp app_name #创建一个应用程序 django-admin startproject project_name #创建一个项目运行django项目 python manage.py runserver 80…

2. PS基本操作

因为网页美工大部分效果图都是利用PS ( Photoshop )来做的,所以以后我们大部分切图工作都是在PS里面完成 ●文件—>打开&#xff1a;可以打开我们要测量的图片 ●CtrlR : 可以打开标尺&#xff0c;或者视图—>标尺 ●右击标尺&#xff0c;把里面的单位改为像素 ●Ctrl加号…

Spring Boot实战:拦截器和监听器的应用指南

当使用Spring Boot时&#xff0c;我们可以通过拦截器&#xff08;Interceptor&#xff09;和监听器&#xff08;Listener&#xff09;来实现对请求和响应的处理。拦截器和监听器提供了一种可插拔的机制&#xff0c;用于在请求处理过程中进行自定义操作&#xff0c;例如记录日志…

【保姆级教程】PyCharm通过SSH远程连接ModelArts

文章目录 一、创建Notebook二、配置SSH三、配置远程Python解释器四、成果展示 一、创建Notebook 首先&#xff0c;找到云资源下面的 ModelArts&#xff0c;然后点击并进入 ModelArts控制台。 在ModelArts控制台中&#xff0c;点击开发环境下的 Notebook 。然后点击创建&#x…

NB-IoT学习笔记 —— NB-IoT介绍

一、简介 NB-IoT 是指窄带物联网&#xff08;Narrow Band Internet of Things&#xff09;技术&#xff0c;是一种低功耗广域&#xff08;LPWA&#xff09;网络技术标准&#xff0c;基于蜂窝技术&#xff0c;用于连接使用无线蜂窝网络的各种智能传感器和设备&#xff0c;聚焦于…

Airtest:Windows桌面应用自动化测试四【Airtest之python本地环境安装、独立IDE运行】

Airtest之python本地环境安装、独立IDE运行 一、环境配置二、安装Airtest三、安装poco四、常见问题4.1若运行代码时&#xff0c;在cv2模块报ImportError: DLL load failed: 找不到指定模块的错&#xff0c;有几种解决方案&#xff1a;4.1.1.本问题的根本原因应该是DLL文件的缺失…