Spring考点总结

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.rhkb.cn/news/426769.html

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

相关文章

数字IC设计\FPGA 职位经典笔试面试整理--语法篇 Verilog System Verilog(部分)

注: 资料都是基于网上一些博客分享和自己学习整理而成的 Verilog 1. 数据类型 Verilog一共有19种数据类型 基础四种数据类型:reg型,wire型,integer型,parameter型 reg型   reg类型是寄存器数据类型的关键字。寄存…

软考(中级-软件设计师)(0919)

软考 一、软件设计师-历年考试考点分布情况-上午-计算机与软件工程知识 知识点分数说明比例软件工程基础知识11开发模型、设计原则、测试方法、质量特性、CMM、Pert图、风险管理14.67%面向对象12面向对象基本概念、面向对象分析与设计、UML、常见算法16.00%数据结构与算法10…

【HarmonyOS NEXT】DevEco快速实现真机截屏,并保存到电脑

点日志点照机图标选一个路径保存图片在ide中右键图片,点复制电脑随便找个位置保存图片https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-screenshot-V5

使用Ubuntu耳机输出正弦波信号

最近有一个项目想使用喇叭发出一个标准的正弦波测试信号,故记录下操作过程 sudo apt install libasound2-dev 否则有可能会报错: alsaaudio.c:28:10: fatal error: alsa/asoundlib.h: No such file or directory 安装pyalsaaudio: pip …

IE浏览器彻底去除浏览器缓存的方法

1.浏览器右上方如图操作 2.点击后会弹出窗口,如图操作 3.点击查看文件如图操作 4.点击后会弹出一个文件夹,在文件夹内CtrlA全选删除全部文件就可以,有提示直接确认即可

智能车镜头组入门(三)巡线

镜头组的特点是通过摄像头来获取赛道的信息,从而达到前瞻的效果,完成转向和速度决策。 我们的方案,带上元素识别,大概在TC264上5ms一帧,所以我们开了100hz的图象。 之前我看别的博客上有人说,他们组的50帧…

光伏检测数据集(六种)

光伏检测数据集(六种) 1.并网光伏系统故障诊断数据集 (该数据集为excel张,对故障类型完成标注)。 2.分布式光伏目标检测数据集 (该数据集共4000张分布式光伏高清图片,均已标注) 3.光伏电池板缺陷检测数据集 (该数据集共2400张光伏板缺陷高清图片&#xf…

DC-DC降压10A电源降压可调模块24V转12V9V5V3V-AH1514芯片

AH1514:一款高效率小体积的DC-DC降压电源芯片 摘要:本文介绍了一款高性能的DC-DC降压电源芯片——AH1514,该芯片具有24V转12V、9V、5V、3V可调输出,支持7V-38V输入,20A峰值输出电流,且具有小体积、高效率的…

【计算机网络】TCP的可靠传输机制、标记位以及编程结构

文章目录 一、TCP的可靠传输的工作原理1、确认应答机制和捎带应答机制2、超时重传3、快速重传4、滑动窗口5、流量控制 未 PSH6、拥塞控制7、延迟应答8、TCP 以段为单位发送数据 二、TCP 首部的六个标记位1、URG2、ACK3、PSH4、RST5、SYN6、FIN 三、TCP网络并发编程 一、TCP的可…

下载docker镜像报错,dial tcp x.x.x.x:443: connect: connection refused

原因是:国外的连接超时了. 解决方案改为阿里云的数据源 打开阿里云 搜索&#xff1a;容器镜像服务 ACR 把你自己的这个直接复制在linux sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF { "registry-mirrors": ["你自己的"] }…

面试官问:如何解决消息队列的延时以及过期失效问题?

消息的可靠性传输 ActiveMQ 要保证消息的可靠性&#xff0c;除了消息的持久化&#xff0c;还包括两个方面&#xff0c;一是生产者发送的消息可以被ActiveMQ收到&#xff0c;二是消费者收到了ActiveMQ发送的消息。 生产者 非持久化又不在事务中的消息&#xff0c;可能会有消…

黑神话悟空+云技术,游戏新体验!

近期&#xff0c;一款名为黑神话悟空的游戏因其独特的艺术风格和创新的技术实现在玩家中产生了不小的影响。 而云桌面技术作为一种新兴的解决方案&#xff0c;正在改变人们的游戏体验方式&#xff0c;使得高性能游戏可以在更多设备上流畅运行。 那么&#xff0c;黑神话悟空如…

《深入理解 Java 线程池:高效管理线程的利器》

线程池 1. 什么是线程池&#xff1f; ​ 线程池内部维护了若干个线程&#xff0c;没有任务的时候&#xff0c;这些线程都处于等待空闲状态。如果有新的线程任务&#xff0c;就分配一个空闲线程执行。如果所有线程都处于忙碌状态&#xff0c;线程池会创建一个新线程进行处理或…

滑动窗口(6)_找到字符串中所有字母异位词

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 滑动窗口(6)_找到字符串中所有字母异位词 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f4…

STM32 芯片启动过程

目录 一、前言二、STM32 的启动模式三、STM32 启动文件分析1、栈 Stack2、堆 Heap3、中断向量表 Vectors3.1 中断响应流程 4、复位程序 Reset_Handler5、中断服务函数6、用户堆栈初始化 四、STM32 启动流程分析1、初始化 SP、PC 及中断向量表2、设置系统时钟3、初始化堆栈并进入…

【Transformer深入学习】之一:Sinusoidal位置编码的精妙

看苏神的文章提到&#xff1a;Transformer原论文使用Sinusoidal位置编码&#xff0c;作为位置编码的一个显式解&#xff0c;Google 在原论文中对它的描述寥寥无几&#xff0c;只是简单提及了它可以表达相对位置信息&#xff0c;并未提及这个编码的合理性。 看了几篇文章&#x…

云计算实训50——Kubernetes基础命令、常用指令

一、Kubernetes 自动补齐 # 安装自动补齐软件 [rootmaster ~]# yum -y install bash-completion # 临时开启自动补齐功能 [rootmaster ~]# source # 永 久开启自动补齐功能 [rootmaster ~]# echo "source > ~/.bashrc 二、Kubernetes 基础命令 kubectl [command] …

【数据结构】数据结构系列学习笔记——导航篇

一&#xff1a;概述 数据结构是计算机科学中的核心概念之一&#xff0c;是优化算法性能和资源利用率的关键。在软件开发和数据处理中&#xff0c;选择合适的数据结构对于算法的效率至关重要。数据结构的选择通常基于数据的使用模式&#xff0c;包括数据元素之间的关系、数据的存…

【专题】2024中国生物医药出海现状与趋势蓝皮书报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37719 出海已成为中国医药产业实现提速扩容的重要途径。目前&#xff0c;中国医药产业发展态势良好&#xff0c;创新能力不断增强&#xff0c;然而也面临着医保政策改革和带量集采带来的压力。政府积极出台多项政策支持医药企业出海…

Vim编辑器常用命令

目录 一、命令模式快捷键 二、编辑/输入模式快捷键 三、编辑模式切换到命令模式 四、搜索命令 一、命令模式快捷键 二、编辑/输入模式快捷键 三、编辑模式切换到命令模式 四、搜索命令