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

在这里插入图片描述

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

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

相关文章

你的隐私被泄漏了吗

近日&#xff0c;某高校毕业生在校期间窃取学校内网数据&#xff0c;收集全校学生个人隐私信息的新闻引发了人们对互联网生活中个人信息安全问题的再度关注。在大数据时代&#xff0c;算法分发带来了隐私侵犯&#xff0c;在享受消费生活等便捷权利的同时&#xff0c;似乎又有不…

Unable to reload Maven project

原因就是IDEA的版本与Maven的版本冲突。 IDEA的日志报错如下&#xff1a; 我当时IDEA是2020版&#xff0c;Maven是3.8.5. 后来把Maven换成3.6.3版本就可以了。

CSS选择器常见用法

目录 一.总体分类 二.基础选择器 &#xff08;1&#xff09;标签选择器 &#xff08;2&#xff09;类选择器 &#xff08;3&#xff09;id选择器 &#xff08;4&#xff09;通配符选择器&#xff08;特殊&#xff09; 三.复合选择器 &#xff08;1&#xff09;后代选择器 &…

【Kubernetes资源篇】Secret加密数据配置管理详解

文章目录 一、Secret加密配置理论知识1、Secret是什么?2、Secret和configMap的区别3、Secret的参数和类型 二、实践&#xff1a;使用Secret进行加密1、方式一&#xff1a;环境变量方式引入2、方式二&#xff1a;卷挂载方式引入 一、Secret加密配置理论知识 1、Secret是什么?…

VM虚拟机端口映射接收CS弹反木马

VM虚拟机端口映射接收CS弹反木马 1. 前言1.1. 前期准备1.2. 整体思路 2. 整体操作流程2.1. 虚拟机配置2.2. WIFI路由器设置2.3. CS设置2.3.1. 创建本地监听器2.3.2. 创建生成木马监听器2.3.3. 创建反弹木马2.3.4. 查看效果 1. 前言 在日常的对客户的内网进行渗透的时候&#xf…

爬虫入门指南(8): 编写天气数据爬虫程序,实现可视化分析

文章目录 前言准备工作爬取天气数据可视化分析完整代码解释说明 运行效果完结 前言 天气变化是生活中一个重要的因素&#xff0c;了解天气状况可以帮助我们合理安排活动和做出决策。本文介绍了如何使用Python编写一个简单的天气数据爬虫程序&#xff0c;通过爬取指定网站上的天…

【论文阅读】一种利用地理实体目标特征的道路场景激光点云配准方法

目录 1 引 言2 道路场景点云配准方法2.1 车载点云分段2.2 配准基元的选取2.3 多尺度关键点的提取2.4 渐进式配准 3 实验与分析3.1 实验数据3.2 关键点提取结果3.3 配准结果 4 结论5 参考文献 摘 要 针对车载移动测量系统不同时期获取的道路场景点云位置一致性差、车载激光点云与…

Windows环境部署MySQL_5.7的安装、测试连接以及卸载全过程实操手册

前言&#xff1a; 前面记录了双环境的oracle的安装卸载及相关测试评估&#xff0c;这里记录下 MySQL5.7社区免费版的部署手册。 什么是 MySQL MySQL 是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;目前属于Oracle 公司。MySQL 是一种关系型数…

【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(数据缓存不一致分析)

一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战&#xff08;数据缓存不一致问题分析&#xff09; 数据不一致的原因逻辑失败导致的数据不一致物理失败导致的数据不一致 数据一致性的解决方案消费消息异步删除缓存主要流程如下图所示 订阅Binlog利用队列…

盘口策略 | 交易中最重要的是什么?

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 『正文』 ˇ 交易中最重要的是什么&#xff1f; 当然是Timing啊~~~ “时机是这个世界上最难得到&#xff0c;又最容易失去的东西”夫难得而易失者,时也&#xff1b;时至而不旋踵者,机也,故圣人常顺时…

VScode中的插件

开启VScode中最简单的内部浏览器 - 可以访问外网 - Browser Preview 插件安装&#xff1a; 插件使用&#xff1a;由下角 - 状态栏 - VS Browser按钮 live sass compiler-vscode插件将scss编译为css live sass compiler是VSCode扩展&#xff0c;可以实时地将SASS / SCSS文件…

【uniapp】学习之【生命周期】

uniapp生命周期 uni-app框架的生命周期分为两种 &#xff1a; 应用中的生命周期 和 页面内的生命周期 uni-app 应用生命周期 uni-app 页面生命周期