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.mzph.cn/news/887725.shtml

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

相关文章

若依解析(一)登录认证流程

JWTSpringSecurity 6.X 实现登录 JWT token只包含uuid ,token 解析uuid,然后某个常量加UUID 从Redis缓存查询用户信息 流程图如下 感谢若依,感谢开源,能有这么好系统供我学习。 设计数据库,部门表,用户表&#xff0c…

阿里巴巴即将超越OpenAI的o1?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

第29天 MCU入门

目录 MCU介绍 MCU的组成与作用 电子产品项目开发流程 硬件开发流程 常用元器件初步了解 硬件原理图与PCB板 常见电源符号和名称 电阻 电阻的分类 贴片电阻的封装说明: 色环电阻的计算 贴片电阻阻值计算 上拉电阻与下拉电阻 电容 电容的读数 二极管 LED 灯电路 钳位作…

Pump Science平台深度剖析:兴起、优势、影响与未来

在过去的几个月里,人们越来越关注去中心化科学(DeSci)。DeSci 是一种利用区块链技术进行科学研究的新方法。传统的科学研究经常面临所谓的“死亡之谷”,这指的是基础科学研究与成功开发和造福患者的实施之间的重要时期。DeSci 旨在…

Tülu 3:重新定义开源大模型的后训练范式

一、引言 在大型语言模型(LLM)的发展历程中,预训练阶段往往受到最多关注,动辄需要数百万美元算力投入和数万亿token的训练数据。然而,一个鲜为人知但同样关键的事实是:预训练完成的模型实际上并不能直接投…

Excel中根据某列内容拆分为工作簿

简介:根据A列的内容进行筛选,将筛选出来的数据生成一个新的工作簿(可以放到指定文件夹下),且工作簿名为筛选内容。 举例: 将上面的内容使用VBA会在当前test1下生成5个工作簿,工作簿名分别为TEST1.xls TEST2.xls TEST3…

【电子通识】“标准的标准”:国家标准GB/T 1.1-2020 标准的分类

标准是可以分类的。比如根据层次、专业、对象、目的、功能等维度进行分类。 以层次进行分类: 可以分为国际标准、区域标准、国家标准、团体标准、企业标准、行业标准 以专业进行分类: 可以分为农业、医药、卫生、劳动保护、矿业、化工、机械等等。 以对象…

【网络安全设备系列】12、态势感知

0x00 定义: 态势感知(Situation Awareness,SA)能够检测出超过20大类的云上安全风险,包括DDoS攻击、暴力破解、Web攻击、后门木马、僵尸主机、异常行为、漏洞攻击、命令与控制等。利用大数据分析技术,态势感…

数据库(MySQL黑马)

基础篇 MySQL概述 数据库概述 数据库相关概念 主流的关系型数据库管理系统 MySQL数据库的安装与启动 下载:MySQL :: MySQL Community Downloads 安装步骤 MySQL―8.0.40超详细保姆级安装教程_mysql8.0.40安装教程-CSDN博客文章浏览阅读1k次。_mysql8.0.40安装教…

Java算法OJ(11)双指针练习

目录 1.前言 2.正文 2.1存在重复数字 2.1.1题目 2.1.2解法一代码 解析: 2.1.3解法二代码 解析: 2.2存在重复数字plus 2.2.1题目 2.2.2代码 2.2.3解析 3.小结 1.前言 哈喽大家好吖,今天来给大家分享双指针算法的相关练习&…

Maven、JAVAWeb、Servlet

知识点目标 1、MavenMaven是什么Maven项目的目录结构Maven的Pom文件Maven的命令Maven依赖管理Maven仓库JavaWeb项目 2.网络基础知识 3、ServletMaven Maven是什么 Maven是Java的项目管理工具,可以构建,打包,部署项目,还可以管理…

python | 6 个在 cmd 中常用的 python 命令

本文涉及的 python 常见使用命令示例 均是在默认已经配置了 python 环境变量的情况下 如果安装 python 环境时没有配置环境变量,需要先进入到安装 python 的文件路径下,否则会提示命令不存在。其原理及配置方法可参考往期文章: 环境变量是…

CondaValueError: Malformed version string ‘~‘: invalid character(s).

问题描述:在window下使用conda安装任何包都会报错。报错信息是CondaValueError: Malformed version string ~: invalid character(s). 解决办法:把.condarc文件的源地址删除(八成是源地址访问不了了),只保存默认的&am…

Zookeeper3.5.8集群部署

环境说明 准备三台服务器,我这边是虚拟机,分别为:bigdata141、bigdata142、bigdata143 下载安装包 下载链接:Index of /dist/zookeeper/zookeeper-3.5.8 下载完后,上传到其中一台服务器,我这边上传到 b…

JVM_总结详解

1、CPU和内存的交互 了解jvm内存模型前,了解下cpu和计算机内存的交互情况。【因为Java虚拟机内存模型定义的访问操作与计算机十分相似】 有篇很棒的文章,从cpu讲到内存模型:[什么是java内存模型?] 在计算机中,cpu和内存的交互最…

屏幕分辨率|尺寸|颜色深度指纹修改

一、前端通过window.screen接口获取屏幕分辨率 尺寸 颜色深度,横屏竖屏信息。 二、window.screen c接口实现: 1、third_party\blink\renderer\core\frame\screen.idl // https://drafts.csswg.org/cssom-view/#the-screen-interface[ExposedWindow ] …

vue3实现自定义导航菜单

一、创建项目 1. 打开HBuilder X 图1 2. 新建一个空项目 文件->新建->项目->uni-app 填写项目名称:vue3demo 选择项目存放目录:D:/HBuilderProjects 一定要注意vue的版本,当前选择的版本为vue3 图2 点击“创建”之后进入项目界面 图…

BASLER工业相机维修不能触发拍照如何处理解决这个问题

BASLER工业相机维修不能触发拍照如何处理解决这个问题?最近遇到挺多工业相机维修咨询这个不能触发拍照的案例,所以今天优米佳维修的技术就抽空整理了这篇关于BASLER相机不能触发拍照的处理方法分享给大家。 当碰到巴斯勒工业相机不能触发拍照的问题&…

深入理解计算机系统,源码到可执行文件翻译过程:预处理、编译,汇编和链接

1.前言 从一个高级语言到可执行程序,要经过预处理、编译,汇编和链接四个过程。大家可以思考下,为什么要有这样的过程? 我们学习计算机之处,就应该了解到,计算机能够识别的只有二进制语言(这是…

HTTP代理是什么,主要用来干嘛?

在探讨互联网通信和数据传输的广阔领域中,HTTP代理作为一个重要而广泛使用的工具,扮演着不可或缺的角色。本文将深入浅出地介绍HTTP代理的基本概念、工作原理及其主要应用场景。 一、HTTP代理的基本概念 HTTP代理,简而言之,是一…