Spring源码基础解析

这里写目录标题

    • Spring从哪开始?
      • Spring的基本运行
      • BeanFactoryPostProcessor与BeanPostProcessor的区别
        • BeanFactoryPostProcessor用来处理bean的定义信息BeanDefinition
        • BeanPostProcessor用来处理Bean对象(包含实例化与初始化)
      • Environment

Spring从哪开始?

  • 聊聊spring
  • 说明bean的生命周期
  • 循环依赖
  • 三级缓存
  • FactoryBean和beanFactory
  • ApplicationContext和BeanFactory的区别
  • 设计模式

什么是Spring?
总 :spring认知
Spring是一个基础的框架(轻量级框架),同时给我们提供了bean的容器,用来帮助我们方便装载具体的bean对象,我们之前在使用对象的时候,必须要程序员自己创建,而现在我们只需要告诉容器有哪些对象,他会帮我们创建好,并且维护整个整体的生命周期,我们在Spring的技术之上还有SpringBoot、SpringCloud一系列扩展的技术框架,这个框架都是在Spring框架为基石的,在上面进行一些扩展开发。
分 ioc
Spring框架中有两个非常重要的特性 IOC 、AOP
IOC表示的是控制反转,原来是我们程序员自己创建对象,现在都交给Spring框架的IOC容器进行创建,管理Bean对象。
AOP表示面向切面编程, 一些用于更业务逻辑无关的代码我们可以通过AOP的方式进行实现,我们日常使用中日志、权限控制,统一上传> 文件参数校验等等都是通过AOP进行实现, 具体的业务逻辑该怎么写就怎么写,后面需要进行扩展的时候可以通过AOP里面的通知往具体
方法的前置、后置、中间、环绕等不同的环境里面添加具体的更业务无关的代码,完成我们具体的功能

Spring在一般情况下都分为两个部分

  1. IOC :控制反转,由Spring进行创建对象,实现层解耦
  2. AOP :面向切面变成,将工程代码与工具代码分离,实现主次解耦

谈到Spring,就一定会说到Spring容器也就是Ioc容器
IOC容器 : 承载某些或者具体的事务(Bean对象)

bean
数据结构
map
三级缓存
K-V格式的数据
创建对象
获取对象
Bean的实例对象

在这里插入图片描述
在这里插入图片描述

Spring的基本运行

在这里插入图片描述
Spring是如何进行创建对象的呢?

  1. 首先提前定义好我们需要的bean对象的描述信息(也就是我们application.xml配置好的文件)
  2. xml对于spring来说,类似于定义的读取文件的配置规范 (这里xml就是定义的规范)
  3. spring通过定义的xml文件规范格式拿到对应的bean定义信息BeanDefinition
  4. 解析这些信息,通过反射的方式实例化bean对象
  5. 然后初始化bean对象,得到一个完整的bean对象

接口 自上向下 不考虑子类实现,遵循接口规范,自上向下
抽象类 自下向上 【三个类有共同特点】生成抽象类,考虑子类之间共性, 自下向上

  • BeanDefinition
    上述Spring的基本运行中,你所有的定义描述信息都在XML文件里面,如何读取呢?
    当然通过 new ClassPathXmlApplicationContext(“applicationcontext.xml”)
    该代码就是读取XML文件,而Bean对象信息就在xml里面,Bean的定义信息通过XML读取到了IOC容器中,此时,IOC的容器出现了bean的定义信息,并赋予了一个名字:BeanDefinition
  • BeanDefinitionReader
    BeanDefinitionReader :规范信息的接口
    BeanDefinitionReader 的作用是读取 Spring 配置文件中的内容,将其转换为 IoC 容器内部的数据结构:BeanDefinition
  • 反射
    • 获取Class对象
      • Class clazz = Class.forName(“完全限定名”);
      • Class clazz = 对象.getClass();
      • Class clazz = 类型.Class;
    • 获取构造器
      • Constructor ctor = clazz.getDeclaredConstructor();
    • 获取对象
      • Object obj = ctor.newInstance();

注意点 :实例化与初始化的区别

实例化
再堆中开辟一块空间属性值都是默认值
初始化
给属性完成赋值操作
填充属性
调用初始化方法
  • 增强器

为了Spring扩展实现

PostProcessor
增强器
后置处理器
扩展

例如下面加载数据库链接,${}内的变量是如何替换的呢?这里就用到了扩展
在这里插入图片描述

    <!--配置数据库连接池--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/><property name="driverClassName" value="${jdbc.driverClass}"/></bean>

BeanFactoryPostProcessor与BeanPostProcessor的区别

BeanFactoryPostProcessor用来处理bean的定义信息BeanDefinition
BeanPostProcessor用来处理Bean对象(包含实例化与初始化)

BeanFactoryPostProcessor用来处理bean的定义信息BeanDefinition

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
现在占位符还存在
在这里插入图片描述
调用invokeBeanFactoryPostProcessors 占位符已经替换了
在这里插入图片描述
在这里插入图片描述
自己扩展,实现BeanFactoryPostProcessor,在创建对象前修改bean的定义信息BeanDefinition
在这里插入图片描述

BeanPostProcessor用来处理Bean对象(包含实例化与初始化)

在这里插入图片描述
在这里插入图片描述
实现AOP,需要用到动态代理

  • 动态代理
    • ObjenesisCglibAopProxy
    • JdkDynamicAopProxy
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

postProcessAfterInitialization方法会执行wrapIfNecessary,最终会执行到createAopProxy方法

    public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {if (bean != null) {Object cacheKey = this.getCacheKey(bean.getClass(), beanName);if (this.earlyProxyReferences.remove(cacheKey) != bean) {return this.wrapIfNecessary(bean, beanName, cacheKey);}}return bean;}protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) {return bean;} else if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {return bean;} else if (!this.isInfrastructureClass(bean.getClass()) && !this.shouldSkip(bean.getClass(), beanName)) {Object[] specificInterceptors = this.getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, (TargetSource)null);if (specificInterceptors != DO_NOT_PROXY) {this.advisedBeans.put(cacheKey, Boolean.TRUE);Object proxy = this.createProxy(bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));this.proxyTypes.put(cacheKey, proxy.getClass());return proxy;} else {this.advisedBeans.put(cacheKey, Boolean.FALSE);return bean;}} else {this.advisedBeans.put(cacheKey, Boolean.FALSE);return bean;}}
    public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {if (!config.isOptimize() && !config.isProxyTargetClass() && !this.hasNoUserSuppliedProxyInterfaces(config)) {return new JdkDynamicAopProxy(config);} else {Class<?> targetClass = config.getTargetClass();if (targetClass == null) {throw new AopConfigException("TargetSource cannot determine target class: Either an interface or a target is required for proxy creation.");} else {return (AopProxy)(!targetClass.isInterface() && !Proxy.isProxyClass(targetClass) ? new ObjenesisCglibAopProxy(config) : new JdkDynamicAopProxy(config));}}}

在这里插入图片描述

Environment

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

扩展 SpringBoot
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

jQuery基础知识:入门、应用与未来发展

随着互联网技术的不断发展&#xff0c;前端开发技术也日新月异。在众多前端框架和库中&#xff0c;jQuery凭借其简洁、易用的特性&#xff0c;一直受到广大开发者的青睐。本文将带您走进jQuery的世界&#xff0c;从基础知识讲起&#xff0c;探讨其应用场景&#xff0c;并展望其…

Mac下Docker Desktop starting的解决方法

记录下自己在新增了一个新的容器后&#xff0c;Disk Size过大导致启动Docker Desktop会一直卡在Docker Desktop starting&#xff0c;并且重启无效的解决方法。该方法无需重新卸载&#xff0c;并且能保留原有的镜像和容器。 一、确认问题 首先确认Docker.raw大小以确认是否和笔…

算法3:查找算法

查找算法 常用查找算法 1,顺序(线性)查找 2,二分查找/折半查找 3,插值查找 4,斐波那契查找 线性查找 线性查找,通过遍历和逐一比对,在发现相同值时返回下标 代码如下 public int Seqsearch(int t, int[] arr) {for (int i 0; i < arr.length; i) {if (t arr[i]) …

前端开发学习笔记 1 (基础概念、HTML5基础、前端开发工具VSCode基本介绍)

文章目录 基础概念篇网页相关的基础概念浏览器和浏览器内核Web标准 HTML5基础HTML的基本语法规范HTML文件基本结构标签文档类型声明标签、文件语言和字符集类型标题标签、段落标签和换行标签文本格式化标签两种容器标签图像标签超链接相关HTML中的注释和特殊字符表格标签列表标…

manacher算法

回文串的性质 回文串类似于ABA&#xff0c;ABCBA,AABBAA等的对于i具有s[i]s[n!-i]的字符串。 回文半径&#xff1a;对于一个回文中心i&#xff0c;如果它的半径为r&#xff0c;如果它为奇数长度的回文串的中心&#xff0c;则说明[ir1,ir-1]为一个回文串。如果i是偶数长度的回…

算法练习----力扣每日一题------4

原题链接 2810. 故障键盘 - 力扣&#xff08;LeetCode&#xff09; 解析&#xff1a; 新建字符串ret,遍历原始字符串遇到i翻转字符串&#xff0c;否则尾插 class Solution { public:string finalString(string s) {string ret;for(auto e : s){if(e i)reverse(ret.begin(),re…

33.Python从入门到精通—Python3 正则表达式 re.match函数 re.search方法 re.match与re.search的区别

33.从入门到精通&#xff1a;Python3 正则表达式 re.match函数 re.search方法 re.match与re.search的区别 Python3 正则表达式re.match函数re.search方法re.match与re.search的区别 Python3 正则表达式 在 Python3 中&#xff0c;可以使用 re 模块来进行正则表达式的匹配和处理…

xtrabackup2.4

xtrabackup2.4只能备份5.*版本 [rootk8s-131 src]# mysql -V mysql Ver 14.14 Distrib 5.7.35, for linux-glibc2.12 (x86_64) using EditLine wrapper [rootk8s-131 src]# ll total 658516 -rw-r--r--. 1 7161 31415 666328842 Jun 7 2021 mysql-5.7.35-linux-glibc2.12-x…

最新版弹幕播放器源码,带后台

最新版弹幕播放器源码&#xff0c;带后台 测试正常分享&#xff0c;祝你使用愉快 弹幕后台、前置广告、暂停广告&#xff0c;记忆回放&#xff0c;自动下一集 支持&#xff1a;.m3u8、.mp4、.flv、等常见视频格式&#xff0c;兼容&#xff1a;电脑、手机端 源码截图&#xf…

【新手适用】手把手教你从零开始实现一个基于Pytorch的卷积神经网络CNN三: 如何验证和测试模型

【新手适用】手把手教你从零开始实现一个基于Pytorch的卷积神经网络CNN二&#xff1a; 如何训练模型&#xff0c;内附详细损失、准确率、均值计算-CSDN博客 从零开始实现一个基于Pytorch的卷积神经网络 - 知乎 (zhihu.com) 1 初始化、导入模型和数据集 新建一个test.py文件&a…

JS中字符串常用方法(持续更新中)

1.charAt()方法 charAt() 方法可返回字符串中指定位置的字符。 let str "Hello"; let s str.charAt(1); console.log(s);//e 语法&#xff1a;string.charAt(index) index 必需值。表示字符串中某个位置的数字&#xff0c;即字符在字符串中的位置。 2.concat()…

基于springboot+vue+Mysql的火车订票管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

uniapp 开发之原生Android插件

开发须知 在您阅读此文档时&#xff0c;我们假定您已经具备了相应Android应用开发经验&#xff0c;使用Android Studio开发过Android原生。也应该对HTML,JavaScript,CSS等有一定的了解, 并且熟悉在JavaScript和JAVA环境下的JSON格式数据操作等。 为了插件开发者更方便快捷的开…

pyside6/pyqt5/pyside2/pyqt6绘制图形

虽然可以在 PySide6 中嵌入 matplotlib 图&#xff0c;但这种体验并不完全是原生的。对于简单且高度交互的绘图&#xff0c;您可能需要考虑改用 PyQtGraph。PyQtGraph 建立在 PySide6 原生 QGraphicsScene 之上&#xff0c;提供更好的绘图性能&#xff0c;特别是对于实时数据&a…

试过了,ChatGPT确实不用注册就可以使用了!

看到官网说不用登录也可以直接使用ChatGPT 我们来试一下 直接打开官网 默认是直接进入了chatgpt3.5的聊天界面 之前是默认进的登录页面 聊一下试试 直接回复了&#xff0c;目前属于未登录状态&#xff0c;挺好&#xff01; 来试下ChatGPT4 跳转到了登录页面 目前来看gpt4还…

JavaScript和SQL Server库的区别总结

目录 背景: JavaScript概述: SQL Server库概述 JavaScript与SQL Server库的主要区别: 总结: 背景: 在Web开发的广阔领域中&#xff0c;JavaScript和SQL Server库各自扮演着不可或缺的角色。虽然它们都是用于构建强大且功能丰富和Web应用程序的工具&#xff0c;但它们在功…

HTML常用文本标签以及注释文本

目录 前言: 1.标题标签&#xff1a; 前言&#xff1a; 实践&#xff1a; 总结&#xff1a; 2.段落标签&#xff1a; 前言&#xff1a; 段落中的空格&#xff1a; 总结: 3.文本格式化标签&#xff1a; 前言: 和标签的区别: 和标记之间的区别: 总结&#xff1a; 4.如…

CCIE过期了要续吗?HCIE难考还是CCIE难考?

瞬息万变的互联网行业里&#xff0c;很多相关的证书都是会过期的&#xff0c;毕竟技术的更新迭代很快&#xff0c;如果不持续学习&#xff0c;势必会被行业所淘汰。 而且这些证书要一直保证自己的含金量&#xff0c;也就一定要随着发展不断革新。 01 CCIE多久过期&#xff1f;…

go入门到精通

初识Go语言 Go语言介绍 Go语言是什么 2009年11月10日&#xff0c;Go语言正式成为开源编程语言家庭的一员。 Go语言&#xff08;或称Golang&#xff09;是云计算时代的C语言。Go语言的诞生是为了让程序员有更高的生产效率&#xff0c;Go语言专门针对多处理器系统应用程序的编…

Spring面试常见问题

目录 1、为什么要用Spring框架&#xff1f;2、有了spring为什么又出现了 springboot&#xff1f;3、springboot出现后为什么又出现了spring cloud&#xff1f;4、SpringBoot自动配置&#xff08;重点&#xff09;5、SpringBoot启动流程&#xff08;重点&#xff09;6、简单谈一…