spring知识点复习--针对面试的

前言

 此内容是笔者通过B站的视频总结而来。原视频链接地址:6、Bean Factory与FactoryBean有什么区别_哔哩哔哩_bilibili

1.谈谈springIOC的理解,原理与实现

回答涉及到的点:

   控制反转:是一种理论思想,原来的对象是由使用者来进行控制的,有了spring之后,可以把整个对象交给spring来帮助我们进行管理的。

   DI:依赖注入,把对应的属性值注入到具体的对象中,在spring的应用:@Autowired,populateBean完成属性值的注入。

源码非常熟悉的时候的回答要涉及的点:

容器:具体存放对象,使用map结构来进行存储的,在spring中一般存在三级缓存,singletonObject存放完成的bean对象,我们一般取对象都会从singletonObject中进行获取。整个bean的生命周期,从创建到销毁的过程,都是由容器来进行管理的,这里可以引出一个bean的生命周期。

1.容器的创建过程,(容器最上层是一个根接口BeanFactory,实际我们用的最多的就是DefaultListableBeanFactory )向beanFactory中进行设置一些参数(BeanPostProcessor,Aware接口的子类)等等属性。

2.加载解析bean对象,准备创建bean对象的定义对象beanDefintion(xml或者注解的解析过程)

3.beanFactoryPostProcessor的处理,这里spring 提供了很多得扩展点,例如,处理占位符得PlaceHolderConfigurationSupport,ConfigurationClassPostProcessor

4,beanFactoryPostProcessor的的注册功能,方便后续对bean对象进行完成的具体的扩展功能

5.通过反射的方式将BeanDefinition对象实例化成具体的bean对象

6.bean对象的初始化过程(填充属性,调用aware子类的方法,调用beanPostProcessor的前置处理方法,调用init-method方法,调用beanPostProcessor的后置处理方法)

7.生成完成的bean对象,通过getBean对象可以直接获取

8.销毁过程

这是我对IOC的整体理解,您看下有什么问题,可以指点我一下。

源码不熟悉的回答方式:

具体的细节 我记不清楚,但是spring的bean都是通过反射来进行生成的,同时包含了很多的扩展点,比如最常用的对BeanFactory的扩展(对占位符号的处理),除此之外,ioc中最核心的也就是填充具体的bean的属性和生命周期()

2.spring IOC的底层实现 

回答的时候要涉及一些方法的名字:createBeanFactory,getBean,doGetBean,createBean,doCreateBean,populateBean,initializingBean

1.先通过createBeanFactory创建出来一个Bean工厂(DefaultListableBeanFactory)

2.开始循环创建对象,因为容器中的bean都是单例,所以优先通过getBean,doGetBean方法从容器中进行查找,找不的话,到第3步

3.通过createBean,doCreateBean方法,以反射的方式创建对象,一般情况下使用的是无参的构造方法(getDelcaredConstructor,newInstance)

4.进行对象属性的填充populateBean

5.进行其他的初始化操作(initializingBean)

3.Bean的生命周期

1.实例化bean:通过反射的方式创建bean对象

2.填充bean的属性:populateBean 循环依赖的问题(三级缓存)

3.调用Aware接口的相关方法:invokeAwareMethod(完成BeanName,BeanFactory,BeanClassLoader对象的属性设置)

4.调用BeanPostProcessor的前置方法,使用比较多的有: ApplicationContextPostProcessor 设置ApplicationContext,Environment,ResourceLoader等对象

5.调用initmethod方法,判断是否实现了initialzingBean接口,如果实现了,调用afterPropertiesSet方法,没有则不进行调用

6.调用BeanPostProcessor的后置方法,spring的Aop就是在此处实现的,AbstractAutoProxyCreator

7.获取到完整的对象,可以通过getBean的方式来进行对象的获取

8.销毁流程,判断是否实现了DispoableBean接口,实现了调用destoryMethod方法

4.spring是如何解决循环依赖的问题

循环依赖问题的由来,A依赖B,B依赖A 就是循环依赖,

1.先创建A对象,实例化A对象,此时A对象中的b属性为空,填充属性b

2.从容器中查找B对象,如果找到了,就不会存在循环依赖的问题,找不到B对象,创建B对象,实例化B对象, 此时B对象中的a属性值为空,填充属性a

这样的话就会形成了依赖,但是我们仔细分析会发现,此时的A对象是存在的,但是不是一个完整的状态,只完成了实例化,未完成初始化。那么我们是不是可以把A对象进行提前暴露,让B对象提前引用这个还没有完整的A对象,所以解决问题的核心在于将实例化和初始化分开,这就是解决循环依赖问题的关联。

此时容器中就需要保存对象的两种状态,完成实例化但未完成初始化,完整状态,因为都在容器中进行存储,所以就要使用不同的map结构来进行存储,所以就会有一级缓存和二级缓存,一级缓存中存放的是成品对象,二级缓存中存放的是半成品对象

那为啥会有三级缓存,三级缓存的value类型是一个ObjectFactory,是一个函数式接口,存在意义是保证是在整个容器运行的过程中,只能有一个同名的bean对象。

   如果一个对象要被代理的话,会先优先生成一个普通的对象,但普通对象和代理对象是不能同时出现在容器中的,因此当一个对象需要被代理的时候,就需要使用代理对象覆盖之前的普通对象,在实际调用的过程中,是没有办法确定什么时候对象被调用的,所以就要求某个对象被调用的时候,优先判断此对象是否需要被代理,类似一种回调机制的实现,因此传入lamba表达式的时候,通过lamba表达式来执行对象的覆盖过程,getEarlyBeanReference(),

因此所有的bean对象在创建的时候,优先放到三级缓存种,在后续的使用过程中,如果需要被代理则返回代理对象,如果不需要被代理,则直接返回普通对象。

缓存的放置时机和删除时机

 三级缓存:createInstance之后  addSingleFactory

 二级缓存:第一次从三级缓存中确定对象是代理对象还是普通对象,同时删除三级缓存 getSingleton

 一级缓存:生成完整对象之后放到一级缓存,删除二级缓存和三级缓存 addSingleton

5.Bean Factoy和FactoryBean有什么区别

相同点:都是用来创建bean对象的

不同点:使用BeanFactoy创建对象的时候,必须遵循严格的生命流程,如果想要简单的自定义某个对象的创建,同时将创建好的对象将给spring管理,那么就需要实现FactoryBean接口

6.spring用到设计模式

  单例模式 bean的创建都是单例

  原型模式:指定作用域为prototype

  工厂模式:BeanFactory

  模板方法模式:postProcessBeanFactory,onRefresh,initPropertyValue

  策略模式:xmlBeanDefinitionReader,PropertiesBeanDefinitionReader

  观察者模式:listener, event事件

  适配器模式:一些以为Adapter

  装饰者模式:BeanWrapper

  责任链模式:使用aop的时候先生成一个拦截器链

  代理模式:动态代理

7.spring的AOP的底层实现原理

  aop的概念,应用场景:事务,日志等,实现原理 动态代理

 bean的创建过程中有一个步骤可以对bean进行扩展实现,aop本身就是一个扩展功能,所以在beanPostProcessor的后置处理方法中来进行实现

 1.代理对象的创建过程,advice,切面,切点

 2.通过jdk或者cglib的方式来生成代理对象

 3.在执行方法调用的时候,会调用到生成的字节码文件中,直接会找到DynamicAdvisedInterceptor中的intercept方法开始进行执行

8.spring的事务是如何回滚的

问题等同于 spring的事务管理是如何实现的?

spring的事务是由AOP实现的,首先要生成具体的代理对象,按照aop的整套流程来执行具体的操作逻辑,正常情况下是要通过通知来完成核心功能,但是事务不是通过事务来实现的,而是通过TransactionInterceptor来实现的。然后调用invoke来实现具体的逻辑

1.先做准备工作,解析各个方法上事务相关的属性,根据具体的属性,是否开启新的事务,

2.当需要开启的时候,获取数据库链接,关闭自动提交功能,开启事务

3.执行具体的sql操作

4.在操作的过程中,如果执行失败了,那么会通过completeTransactionAfterThrowing来完成事务的回滚操作,回滚的具体逻辑是通过doRollBack方法实现的,实现的逻辑也是先获取连接,通过链接对象来回滚

5.如果执行过程中,没有任何意外情况发生,通过completeTransactionAfterReturning来完成事务的提交操作,提交的具体逻辑是通过doCommit方法实现的,实现的逻辑也是先获取连接,通过链接对象来提交

6.当事务执行完毕之后,需要清除线相关的事务信息 cleanTransationInfo

9.spring事务的传播特性

传播特性有几种?7种

Rquired,Requires_new,nested,support,not_support,never,mandatory

A方法调用B方法,AB方法都有事务,并且传播特性不同,那么A如果有异常的话,B怎么办,B如果有异常,A怎么办?

事务的传播特性是指不同方法的嵌套调用的时候,事务应该如何进行处理,是用同一个事务,还是不同的事务,当出现异常的时候,是回滚还是提交。

1.事务的不同分类 可以分为三类,支持当前事务,不支持当前事务,嵌套事务

2.如果外层方法是required,内层方法是required,requires_new,nested

3.如果外层方法是requires_new,内层方法是required,requires_new,nested

4.如果外层方法是nested,内层方法是required,requires_new,nested

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

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

相关文章

scrapy豆瓣爬虫增强-批量随机请求头

1.1 豆瓣爬虫增强,中间件随机请求头 1.2 清除原有的中间件,进行中间件测试 1.3 导入全新的中间件 1.4 运行爬虫,这个时候的请求头是固定的 1.5 强化对agent的输出,会舍弃输出cookie,使输出更明了 1.6 转移输出请求头位置 新增输出 造成这样问题的原因是Douban/Douban/settings…

非关系型数据库有哪些特点?

非关系型数据库(NoSQL)具有以下主要特点‌:‌1 ‌灵活的数据存储方式‌:非关系型数据库不采用传统的基于表格的数据存储方式,而是采用更加灵活的数据存储方式。它可以存储各种类型的数据,包括文本、图像、音…

智慧防汛平台在城市生命线安全建设中的应用

随着城市化进程的加快,城市基础设施的复杂性和互联性不断增强,城市生命线的安全管理面临前所未有的挑战。智慧防汛平台作为城市生命线安全建设的重要组成部分,通过现代信息技术提升城市防汛应急管理的智能化水平,保障城市安全。 …

【ChatGPT大模型开发调用】如何获得 OpenAl API Key?

如何获取 OpenAI API Key 获取 OpenAI API Key 主要有以下三种途径: OpenAI 官方平台 (推荐): 开发者用户可以直接在 OpenAI 官方网站 (platform.openai.com) 注册并申请 API Key。 通常,您可以在账户设置或开发者平台的相关页面找到申请入口。 Azure…

vue3 发送 axios 请求时没有接受到响应数据

<script setup> import Edit from ./components/Edit.vue import axios from axios import { onMounted,ref } from vue// TODO: 列表渲染 //装数据的列表 const list ref([]) const count ref(0) const getList async () > {//通过发送 /list 请求从后端拿到列表数…

衡山派D133EBS 开发环境安装及SDK编译烧写镜像烧录

1.创建新文件夹&#xff0c;用来存放SDK包&#xff08;其实本质就是路径要对就ok了&#xff09;&#xff0c;右键鼠标通过Open Git Bash here来打开git 输入命令 git clone --depth1 https://gitee.com/lcsc/luban-lite.git 来拉取&#xff0c;如下所示&#xff1a;&#xff0…

关于Vscode配置Unity环境时的一些报错问题(持续更新)

第一种报错&#xff1a; 下载net请求超时&#xff08;一般都会超时很正常的&#xff09; 实际时并不需要解决&#xff0c;它对你的项目毫无影响 第二种报错&#xff1a; .net版本不匹配 解决&#xff1a;&#xff08;由于造成问题不一样&#xff0c;所以建议都尝试一次&…

快速理解微服务中Fegin的概念

一.由来 1.在传统的架构里面&#xff0c;我们是通过使用RestTemplate来访问其他的服务&#xff0c;但是这种方式就存在了一个很大的缺陷&#xff0c;也就是被调用方如果发生了服务的迁移(IP和端口发生了变化)&#xff0c;那么调用方也需要同步的在代码里面进行修改&#xff0c;…

【网络安全 | 漏洞挖掘】绕过SAML认证获得管理员面板访问权限

未经许可,不得转载。 文章目录 什么是SAML认证?SAML是如何工作的?SAML响应结构漏洞结果什么是SAML认证? SAML(安全断言标记语言)用于单点登录(SSO)。它是一种功能,允许用户在多个服务之间切换时无需多次登录。例如,如果你已经登录了facebook.com,就不需要再次输入凭…

STM32C011开发(1)----开发板测试

STM32C011开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32C011F4P6-TSSOP20 评估套件可以使用户能够无缝评估 STM32C0 系列TSSOP20 封装的微控制器功能&#xff0c;基于 ARM Corte…

医院分诊管理系统|Java|SSM|VUE| 前后端分离

【重要1⃣️】前后端源码万字文档部署文档 【重要2⃣️】正版源码有问题包售后 【重要3⃣️】可复制品不支持退换货 【包含内容】 【一】项目提供非常完整的源码注释 【二】相关技术栈文档 【三】源码讲解视频 【其它服务】 【一】可…

Android数据存储——文件存储、SharedPreferences、SQLite、Litepal

数据存储全方案——详解持久化技术 Android系统中主要提供了3中方式用于简单地实现数据持久化功能&#xff0c;即文件存储、SharedPreference存储以及数据库存储。除了这三种方式外&#xff0c;还可以将数据保存在手机的SD卡中&#xff0c;不给使用文件、SharedPreference或者…

vue3 + vite + antdv 项目中自定义图标

前言&#xff1a; 去iconfont-阿里巴巴矢量图标库 下载自己需要的icon图标&#xff0c;下载格式为svg&#xff1b;项目中在存放静态资源的文件夹下 assets 创建一个存放svg格式的图片的文件夹。 步骤&#xff1a; 1、安装vite-plugin-svg-icons npm i vite-plugin-svg-icons …

【H2O2|全栈】Node.js(2)

目录 前言 开篇语 准备工作 npm 概念 常见指令 项目中的包 创建项目 启动项目 服务器搭建 express 基本步骤 搭建应用 创建路由 监听端口 启动服务器 面试相关 结束语 前言 开篇语 本系列博客分享Node.js的相关知识点&#xff0c;本章讲解npm与服务器的简单…

QChart数据可视化

目录 一、QChart基本介绍 1.1 QChart基本概念与用途 1.2 主要类的介绍 1.2.1 QChartView类 1.2.2 QChart类 1.2.3QAbstractSeries类 1.2.4 QAbstractAxis类 1.2.5 QLegendMarker 二、与图表交互 1. 动态绘制数据 2. 深入数据 3. 缩放和滚动 4. 鼠标悬停 三、主题 …

Harbor安装、HTTPS配置、修改端口后不可访问?

Harbor安装、HTTPS配置、修改端口后不可访问&#xff1f; 大家好&#xff0c;我是秋意零。今天分享Harbor相关内容&#xff0c;安装部分可完全参考官方文档&#xff0c;写的也比较详细。 安装Harbor 官方文档&#xff1a;https://goharbor.io/docs/2.12.0/install-config/ …

MTK 展锐 高通 sensorhub架构

一、MTK平台 MTK框架可以分为两部分&#xff0c;AP和SCP。 AP是主芯片&#xff0c;SCP是协处理器&#xff0c;他们一起工作来处理sensor数据。 SCP 是用来处理sensor和audio相关功能和其他客制化需求的一个协处理理器&#xff0c;MTK SCP选择freeRTOS作为操作系统&#xff0c…

JDK的版本演化,JDK要收费吗?

Java版本演化历史 Java的版本历史可以追溯到1995年&#xff0c;以下是Java语言自诞生以来的主要版本及其关键特性&#xff1a; 一、早期版本 Java 1.0&#xff08;1996年1月发布&#xff09; 引入了Java虚拟机&#xff08;JVM&#xff09;和Java应用编程接口&#xff08;API&…

【Code First】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列 &#x1f…

podman 源码 5.3.1编译

1. 构建环境 在麒麟V10服务器操作系统上构建&#xff1a;Kylin-Server-V10-GFB-Release-2204-Build03-ARM64.iso。由于只是编译 podman 源码&#xff0c;没必要特地在物理机或服务上安装一个这样的操作系统&#xff0c;故采用在虚拟机里验证。 2. 安装依赖 参考资料&#xf…