Spring考点总结

news2024/9/19 9:02:31

01.Spring框架的基本理解

关键字:核心思想IOC\AOP\作用(解耦、简化),简单描述框架组成

Spring框架是一款轻量级的开发框架,核心思想是IOC(控制反转)和AOP(面向切面编程),

为Java应用程序开发提供了组件管理服务,

用于组件之间的解耦,以及简化第三方JavaEE中间件技术的使用(JMS、任务调度、缓存、ORM框架),是一个基础架构型的开发框架。

Spring框架包括:IOC容器、Validation数据校验、AOP面向切面编程、Transactions事务管理、Spring JDBC、Spring MVC框架、以及各类第三方JavaEE中间件技术集成;

02.Spring框架由哪些模块组成?

关键字:官方文档描述,由7个模块组成

Spring Framework 根据官方文档的描述,主要包括以下常用5个模块:

1、Core:核心模块 2、Testing:测试模块 3、Data Access:数据访问模块 4、Web Servlet:基于Servlet的web应用开发 5、Integration:企业级系统集成模块(不同系统之间的交互集成)

03.Spring IOC的理解

关键字:IOC名词解释,作用是解耦,使用IOC容器管理项目组件之间的耦合关系

IOC(Inversion of Control,中文释义:控制反转)是Spring框架的核心思想之一,主要用于解耦,IOC是指将创 创建对象的控制权转移给Spring框架进行管理。由Spring框架根据配置文件或注解等方式,创建bean对象并管理各个对象之间的依赖关系。使对象之间形成松散耦合关系,实现解耦;

控制:指的是对象创建(实例化、管理)的权力

反转:控制权交给外部环境(Spring框架、IOC容器)

04.Soring IOC容器的理解

关键字:IOC容器的作用、存储形式、初始化过程

IOC通常被理解为IOC Container容器,IOC容器其实就是一个Map,key是每个bean对象的ID,Value是bean对象本身。IOC容器负责创建bean对象并管理bean的生命周期。并且根据配置好的配置文件或注解,管理IOC容器中的每个bean,以及根据bean之间的依赖关系,完成bean之间的注入。

IOC容器属于Spring Core模块,用来创建和管理Bean,默认使用单例的方式将bean存储在DefaultListableBeanFactory类的beanDefinitionMap中(一个ConcurrentHashMap类型的Map集合)。

IOC容器使用ConcurrentHashMap集合存储了BeanDefinition对象,该对象封装了Spring对一个Bean所有配置信息,包括:类名、属性、构造方法参数、依赖、是否延迟加载、是否是单例等配置信息。

05.Spring DI 的理解

关键字:名词解释

DI(Dependency Inject , 中文释义:依赖注入)是对IOC概念的不同角度的描述,是指应用程序在运行时,每一个bean对象都依赖IOC容器注入当前bean对象所需要的另外一个bean对象。(例如在MyBatis整合Spring时,SqlSessionFactoryBean依赖IOC容器注入一个DataSource数据源bean)

06.什么是Spring 的 bean

简单来说,Bean代表被IOC容器管理的对象。

我们通过配置文件或注解,告诉IOC容器帮助我们管理哪些对象。

07.将一个类声明为Bean的注解由哪些?

@Component:定义通用Bean的注解,可标注任意类为Bean。如果一个Bean不知道属于哪个层,可以使用@Component注解标注。

@Repository:定义数据访问层Bean注解

@Service:定义业务层Bean的注解

@Controller:定义控制器Bean的注解

08.@Component和@Bean的区别是什么

@Component:注解作用于类,而@Bean注解作用于方法

@Component通常是通过类路径扫描来实现自动扫描并完成装配Bean到Spring IOC容器中。

@Bean注解通常用于注解某个方法,通过@Bean注解告诉了Spring IOC容器,该方法的返回值实例是一个Bean

09.@Autowire和Resource的区别是什么

@Autowire是Spring提供的注解,@Resource是JDK提供的注解

@Autowire默认的注入方式是byType(按类型自动注入),@Resource默认注入方式为byName(按名称自动注入)。

10.Spring框架中的常见注入方式有几种

关键字:整体解释三种注入方式,分别介绍每个注入方式的细节

Spring IOC有三种注入方式:构造注入、Setter注入、属性注入

构造注入:使用构造方法注入bean

Setter注入:使用Setter方法注入bean

属性注入:使用成员变量注入bean,不推荐。原因:使用私有的成员属性变量,依靠反射实现,破坏封装,只能依靠IOC容器实现注入,不严谨。

11.Spring中常见的ApplicationContext实现类由哪些

关键字:分别介绍每种实现类或子接口

ClassPathXmlApplicationContext:根据项目类路径classpath下的配置文件加载bean;

FileSystemXmlApplicationContext:根据当前磁盘的一个绝对系统文件路径下的配置文件加载bean;

AnnotationConfigApplicationContext:根据读取到的注解加载bean;

WebApplicationContext:Web容器下按照配置文件加载bean;

12.Spring框架中的Bean的作用域

singleton:Spring只会为该bean对象创建唯一实例,Spring中的bean默认都是单例

propotype:每次获取bean,spring会创建一个新的bean实例;

request:每一次HTTP请求,Spring会创建一个新的bean实例;

session:不同的HTTP绘画,Spring会创建不同的bean实例;

13.Spring框架中的Bean的线程安全

对应prototype作用域的Bean,每次都创建一个新对象,也就是线程之间不存在Bean共享,因此不会有线程安全问题

对于singleton作用域的Bean,所有线程都共享一个单例状态的Bean,存在资源竞争,因此是存在线程安全问题的

解决办法:
        对于singleton作用域的单例bean它的线程安全问题,常见有两种解决方法:

                在bean中尽量避免定义可变的成员变量(用于保存数据的成员变量);

                在类中定义一个ThreadLocal成员变量,将需要可变的成员变量保存在ThreadLocal中;

14.Spring框架中的Bean生命周期

Spring Bean的生命周期总体分四个阶段:实例化=>属性注入=>初始化=>销毁

1、实例化Bean        2、注入对象依赖的属性值或对象        3、处理各种Aware接口

4、执行BeanPostProcessor前置处理        5、执行InitializingBean初始化方法

6、执行init-method自定义初始化方法        7、执行BeanPostProcessor后置处理

以上几个步骤完成后,Bean已经被正常创建,可以正常使用这个Bean了。

8、执行DisposableBean销毁Bean        9、执行destroy-method自定义销毁方法

15、Spring 框架如何解决循环依赖

循环依赖问题是指:类与类之间的依赖关系形成了闭环,就会导致循环依赖的产生。例如A类依赖B类,B类依赖C类,而最后C类有依赖A类,这样就形成了循环依赖问题。可以通过三级缓存的方式来解决循环依赖问题

Spring 容器创建 bean 的过程中使用了三级缓存:

  1. 一级缓存(singletonObjects):存放完全初始化好的单例 bean。
  2. 二级缓存(earlySingletonObjects):存放提前曝光的单例 bean,这些 bean 还没有完全初始化好。
  3. 三级缓存(singletonFactories):存放 ObjectFactory 对象,用于在需要时创建单例 bean。

假设存在两个 bean A 和 B,A 依赖 B,B 依赖 A。当 Spring 容器创建 bean A 时:

  1. 首先,Spring 尝试从一级缓存中获取 bean A,发现不存在。
  2. 接着,开始创建 bean A 的实例,但在注入 bean A 对 bean B 的依赖时,发现需要创建 bean B。
  3. Spring 又尝试从一级缓存中获取 bean B,发现不存在,然后开始创建 bean B 的实例。
  4. 在创建 bean B 的过程中,注入 bean B 对 bean A 的依赖时,Spring 首先从一级缓存中获取 bean A,不存在;然后从二级缓存中获取,也不存在;最后从三级缓存中获取。
  5. 由于此时 bean A 还在创建过程中,但是可以通过三级缓存中的 ObjectFactory 获取一个提前曝光的 bean A(虽然还未完全初始化好),并将其放入二级缓存。
  6. bean B 继续创建过程,完成初始化后,将 bean B 放入一级缓存,并从二级缓存中移除。
  7. bean A 继续创建过程,完成初始化后,将 bean A 放入一级缓存,并从二级缓存中移除。

通过这种方式,Spring 有效地解决了循环依赖问题。需要注意的是,Spring 只能解决单例 bean 的循环依赖问题,对于原型(prototype)bean 的循环依赖是无法解决的。

16.Spring框架中有哪些注解

用于声明Bean的注解:

@Component:定义通用Bean的注解,可标注任意类为Bean。如果一个Bean不知道属于哪个层,可以使用@Component注解标注

@Repository:定义数据访问层Bean的注解

@Service:定义业务层Bean的注解

@Controller:定义控制器Bean的注解

用于注入的注解:

@Autowired:按类型自动注入

@Qualifier:按名称自动注入

用于声明配置、扫码、启用特性的注解:

@Configuration:声明配置类

@ComponentSca:组件扫描

@EnableScheduling:启用任务调度

@EnableAspectJAutoProxy:启用自动代理工厂

17.Spring框架中用到的设计模式

工厂模式:Spring使用工厂模式,通过BeanFactory或ApplicationContext来创建对象;

单例模式:Bean默认作用域为单例,按照单例设计模式进行设计实现;

策略模式:Resource的实现类,针对不同的资源文件,实现了不同方式的资源获取策略;

代理模式:Spring的AOP的实现依靠动态代理(JDK的反射和CDLIB);

模板方法:Spring提供了JdbcTemplate,RedisTemplate等模板对象,将相同的操作步骤进行了封装;

适配器模式:Spring AOP的增强或通知(Advice)使用了适配器模式,Spring MVC中也用到了适配器模式适配Controller;

18.Spring框架中AOP的基本理解

关键字:AOP名词解释,AOP实现原理(动态代理)

AOP(Aspect-Oriented Programming:面试切面编程):将那些与业务无关,却为业务模块共同调用的逻辑(例如事务处理、日志管理、权限控制等)封装抽取成一个可重用的模块,这个模块被命名为切面(Aspect),便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性;

Spring AOP基于动态代理实现:

        如果被代理的对象,已经实现某个接口,则Spring AOP会使用JDK Proxy(反射),基于接口的方式,创建代理对象(JDK动态代理的核心是InvocationHandler接口和Proxy类);

        如果被代理的对象,没有实现某个接口,就无法使用JDK Proxy去进行代理了,这时候Spring AOP会使用Cglib,基于继承的方式,生成一个被代理的子类来作为代理(Cglib动态代理的核心是MethodInterceptor接口和Enchancer类)

19.Spring AOP和AspectJ AOP有什么区别

关键字:增强方式的差异(运行时、编译时),实现方式的差异(动态代理、字节码操作)

Spring AOP已经集成了AspectJ,AspectJ是一个Java技术生态系统中实现AOP编程思想的独立框架;AspectJ相比于Spring AOP功能更加强大,但是Spring AOP相对来说更简单更容易。

Spring AOP属于运行时增强,而AspectJ是编译时增强;

Spring AOP基于动态代理(Proxying),而AspectJ基于字节码操作(Bytecode Manpulation)

20.Spring AOP有哪些通知类型

关键字:分别介绍每种通知的实现接口,执行方式

前置通知:实现MethodBeforeAdvice接口,在目标方法调用前,执行通知;

环绕通知:实现MethodInterceptor接口,是一个包围目标方法的通知。环绕通知可以在方法调用前后完成自定义的行为。

后置通知:实现AfterReturningAdvice接口,在目标方法调用后,执行通知(如果方法抛出异常,则不执行通知)

异常通知:实现ThrowsAdvice接口,在方法抛出异常的时,执行通知;

21.Spring管理事务的方式有几种

编程式事务:在代码中硬编码(不推荐使用):通过TransactionTemplate或者TransactionManager手动管理事务,实际应用中很少使用,用于理解Spring事务管理

声明式事务:在XML配置文件或者基于注解@Transaction(推荐使用),通过AOP实现。

22.Spring事务中有哪几种事务传播行为?

1、TransactionDefinition.PROPAGATION_REQUIRED

如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。@Transactional注解默认使用的事务传播行为。

2、TransactionDefinition.PROPAGATION_REQUIRED_NEW

创建一个新的事务,如果当前存在事务,则把当前事务挂起,也就是说不管外部方法是否开启事务,Propagation.REQUIRES_NEW修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰

3、TransactionDefinition.PROPAGATION_NESTED

如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行,如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED

4、TransactionDefinition.PROPAGATION_MANDATORY

如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:代表强制性)

5、TransactionDefinition.PROPAGATION_SUPPORTS

如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

6、TransactionDefinition.PROPAGATION_NOT_SUPPORTED

以非事务的方式运行,如果当前存在事务,则把当前事务挂起

7、TransactionDefinition.PROPAGATION_NEVER

以非事务的方式运行,如果当前存在事务,则抛出异常

23.Spring事务中有哪几种隔离级别、

1、TransactionDefinition.ISOLATION_DEFAULT 默认隔离级别

使用当前数据库的默认隔离级别,MySQL默认采用的是可重复读REPEATABLE_READ隔离级别。

Oracle默认采用的是读已提交READ_COMMITTED隔离级别。

2、TransactionDefinition.ISOLATION_READ_UNCOMMITTED 读未提交

最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读

3、TransactionDefinition.ISOLATION_READ_COMMITTED 读已提交

允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读和不可重复读仍有可能发生

4、TransactionDefinition.ISOLATION_REPEATABLE_READ 可重复读

对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍又可能发生

5、TransactionDefinition.ISOLATION_SERIALIZABLE 串行化

最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能,通常情况下也不会用到这个级别。

24.Spring事务会在什么情况下失效

1、数据库不支持事务        2、事务方法未被Spring管理        3、方法没有被public修饰

4、同一类中方法调用        5、未配置事务管理器                  6、方法的事务传播类型不支持事务

7、不正确的捕获异常        8、错误的标注异常类型             

25.谈谈你对SpringMVC的理解

首先,MVC模式是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将请求处理控制、业务逻辑、数据显示等流程节点分离的思想来组织编码。

所以,MVC是一种设计模式,而SpringMVC是一款基于MVC设计模式思想实现的MVC框架,属于Spring技术栈的一部分。Spring MVC可以帮助我们进行更简洁的Web层的开发,并且它天生与Spring框架集成,更利于架构的设计与搭建。

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

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

相关文章

使用Addressables+SpriteAtlas打包产生冗余

1)使用AddressablesSpriteAtlas打包产生冗余 2)使用SBP打AssetBundle脚本引用丢失 3)Unity构建后处理(IPostprocessBuildWithReport等接口)抛出异常后,构建不会停止 4)Unity 2022.3.0版本使用Oc…

基于YOLOv8的RTSP视频流实时目标检测与告警系统设计与实现(超详细)

前言 在训练模型完成后,想把模型应用起来,比如模型可以部署到项目中,实时接收RTSP视频流进行识别检测,一旦达到自己所设置的置信度阈值(例如大于0.5),系统就会实时把报警信息发送给服务端&…

基于web的工作管理系统设计与实现

博主介绍:专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

01 Vim 编辑器的简单使用

目前在类liunx系统上,我们使用比较多的是 vim 编辑器。vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。 文章目录 1 vim介绍2 vim 三种模式3 常用快捷键一般模式操作:切换模式操作:增删…

体感魂斗罗(一)

文章目录 体感魂斗罗实现步骤设备读取摄像头视频流使用电脑摄像头读取局域网内手机摄像头效果示意IP摄像头底部工具栏 体感魂斗罗实现步骤 目前想到的有如下步骤 读取摄像头视频流图像检测人体关键点关键点转换为人体姿势固定姿势转换键盘键位 设备 摄像头(可用手…

[数据集][目标检测]文本表格检测数据集VOC+YOLO格式6688张5类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):6688 标注数量(xml文件个数):6688 标注数量(txt文件个数):6688 标注…

上半年亏损扩大/百亿资产重组终止,路畅科技如何“脱困”?

在智能网联汽车市场形势一片大好的前提下,路畅科技上半年的营收却出现了下滑,并且亏损也进一步扩大。 2024年半年度报告显示,路畅科技营业收入1.35亿元,同比下滑7.83%;实现归属上市公司股东的净利润为亏损2491.99万元…

【oj刷题】二分查找篇:二分查找算法的原理和应用场景

前言: 二分查找算法,又称折半查找算法,是一种在有序数组中查找特定元素的高效查找方法。它通过将搜索区间不断缩小一半,从而在对数时间内找到目标元素。二分查找是基于分治策略的一种典型应用,能够高效的处理许多问题&…

软考高级:嵌入式系统调度算法 AI 解读

嵌入式系统中的调度算法用于管理任务的执行顺序,确保系统资源能够有效分配。以下是几种常见的调度算法的通俗讲解。 生活化例子 想象你是一位超市收银员,有很多顾客排队,每位顾客都可以看作一个任务,收银台就是你的处理器。你需…

1.1 软件测试 + AI

欢迎大家订阅【软件测试】学习专栏,开启你的软件测试学习之旅! 文章目录 前言一、软件测试二、人工智能的引入 前言 人工智能的引入为软件测试带来了巨大的变革,不仅提升了测试效率和准确性,也为软件质量的保障提供了新的手段。通…

通信工程学习:什么是ONT光网络终端

ONT:光网络终端 ONT(Optical Network Terminal,光网络终端)是光纤接入网络(FTTH)中的关键设备,用于将光纤信号转换为电信号或将电信号转换为光信号,以实现用户设备与光纤网络的连接。…

华为OD机试 - 返回矩阵中非1的元素个数 - 广度优先搜索BFS(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

最长连续子序列 - 华为OD统一考试(E卷)

OD统一考试(E卷) 分值: 100分 题解: Java / Python / C 2024华为OD机试(E卷D卷C卷)最新题库【超值优惠】Java/Python/C合集 题目描述 有N个正整数组成的一个序列。给定整数sum,求长度最长的连续…

WIFI路由器的套杆天线简谈

❝本次推文简单介绍下WIFI路由器的套杆天线。 路由器天线 路由器在这个万物互联的时代,想必大家对其都不陌生。随着科技的发展,常用的路由器上的天线也越来越多,那么问题来了:天线越多,信号越好吗?路由器…

前端mock了所有……

目录 一、背景描述 二、开发流程 1.引入Mock 2.创建文件 3.需求描述 4.Mock实现 三、总结 一、背景描述 前提: 事情是这样的,老板想要我们写一个demo拿去路演/拉项目,有一些数据,希望前端接一下,写几个表格&a…

Linux进程间通信——探索共享内存—— 剖析原理, 学习接口应用

前言:本节内容主要讲解进程间通信的, systemV版本下的共享内存。 共享内存,顾名思义, 其实就是一块内存, 它不同于管道是一个文件。 所以它的传输速度是很快的。 因为管道是文件,有缓冲区, 而共…

Day99 代码随想录打卡|动态规划篇--- 01背包问题

题目(卡玛网T46): 小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等&am…

LeRobot - 让现实机器人更易学

文章目录 一、关于 LeRobot特点模拟环境中预训练模型的示例 致谢教程 - Getting Started with Real-World Robots 二、安装三、Walkthrough1、可视化数据集2、LeRobotDataset的格式3、评估预先训练的策略4、训练你自己的政策复制最先进的(SOTA) 四、贡献…

Vue3 中 Aos 动画同时触发的解决办法

文章目录 问题现象解决之后的效果解决办法问题猜测 问题现象 我总共有四行数据,每一行都是一个动画,但是触发第一个之后其他三个也都触发了 我想要的效果是:动画从底部出现的时候触发一个动画,不要都触发掉 解决之后的效果 解决…

智慧卫生间系统:引领公共卫生间管理的新时代@卓振思众

随着城市化进程的加快,公共卫生间的使用频率不断增加。如何提升公共卫生间的使用体验、管理效率以及卫生水平,已成为各地政府和管理者关注的焦点。智慧卫生间系统应运而生,成为解决这一问题的重要工具。它结合了物联网技术和智能管理理念&…