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.xdnf.cn/news/143998.html

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

相关文章

武器检测系统源码分享

武器检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

Python基础(八)——MySql数据库

一.数据库 【库——>表——>数据】 借助数据库对数据进行组织存储,借助SQL语言对数据库、数据进行操作管理 Mysql数据库 下载:https://www.mysql.com/ 查看是否安装配置成功: 安装DBeaver用于Mysql数据库图形化 安装:…

分布式光伏充换电站相关建议

了推动光伏发电和电动汽车的发展,在土地资源日益紧缺的城市区域,需合理共享现有土地资源,实现资源大化利用。城市变电站由于其合理的分布密度以及便利的接入条件,对于建设分布式光伏发电、充换电站具有很好的优势。可利用变电站旧…

统信服务器操作系统【1050e版】安装手册

统信服务器操作系统1050e版本的安装 文章目录 功能概述一、准备环境二、安装方式介绍安装步骤步骤一:制作启动盘步骤二:系统的安装步骤三:安装引导界面步骤四:图形化界面安装步骤五:选择安装引导程序语言步骤六:进入安装界面步骤七:设置键盘步骤八:设置系统语言步骤九:…

关于wordPress中的用户登录注册等问题

前言 大家在做类似的功能的时候,有没有相关的疑问。那就是我都已经选择好了相应的主题和模版,但是为什么都没有用户注册和用户登录的页面存在呢? WordPress默认情况下不提供用户注册和登录功能的原因是它最初是作为一个博客平台开发的&…

net await 、 Task、 Async 不用async异步方法

详细资料 lamda 变成异步方法 ,只要在前面 加 async 修饰 即可 》》await 修饰的 ,await 所在的方法,必须修饰 async ThreadPool.QueueUserWorkItem( async (obj)>{while(true){await File.WriteAllTextAsync("路径","…

【数据仓库】数据仓库层次化设计

一、基本概念 **1. RDS(RAW DATA STORES,原始数据存储)** RDS作为原始数据存储层,用于存储来自各种源头的未经处理的数据。这些数据可能来自企业内部的业务系统、外部数据源或各种传感器等。RDS确保原始数据的完整性和可访问性&…

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

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

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

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

不得不说 Sam‘s Club 的数字化做得挺好

因正好有东西要退货就顺便看了下订单如何退货。 但发现 Sam’s Club 的所有交易都能够从后台查到,同时还提供了个 CSV 文件的下载。 打开下载文件就能看到全部的数字化的交易记录。 就拿加油这个事情来说,能够非常清楚这一年在 Sam’s Club 加油多少加…

【无人机设计与控制】基于粒子群算法的三维无人机航迹规划

摘要 本文研究了基于粒子群算法(PSO)的三维无人机航迹规划问题。通过粒子群优化算法,无人机能够在复杂三维环境中进行路径规划,以避开障碍并实现最优路径飞行。该方法有效结合了无人机的飞行动力学特性与环境约束,能够…

【GlobalMapper精品教程】087:基于DEM的山脊线提取

文章目录 一、山脊线介绍二、加载实验数据三、山脊线提取一、山脊线介绍 山脊线是指沿山脊走向布设的路线,通常也是山脊最高点的连线,它在地形表示和测绘科学技术中具有重要地位。 山脊线是大体上沿分水岭布设的路线,也被称为山脊的最高棱线。在等高线地图上,山脊线表现为…

计算机网络(七) —— https协议与网络安全证书

目录 一,关于https 二,关于加密 2.1 明文,密钥 2.2 对称和非对称加密 2.3 数据摘要,数据指纹,数字签名 三,https过程过程探究 四,证书 4.1 CA认证 4.2 证书大致内容和申请流程 4.3 签…

fastadmin 定义通用搜索默认值,实现datetimerange默认搜索今日的列表数据,列表查询慢解决方案

文章目录 前言实例完结 前言 fastadmin默认会展示全部列表数据,随着数据越来越多,一次性查询出全部的数据会导致列表查询越来越慢 sql优化可以查看我这篇文章:分享最全的sql优化解决方案 除了基本的sql优化查询速度外,我们还可…

网络爬虫到底难在哪里?

如果你是自己做爬虫脚本开发,那确实难,因为你需要掌握Python、HTML、JS、xpath、database等技术,而且还要处理反爬、动态网页、逆向等情况,不然压根不知道怎么去写代码,这些技术和经验储备起码得要个三五年。 比如这几…

Cursor免费 GPT-4 IDE 工具的保姆级使用教程

Cursor免费 GPT-4 IDE 工具的保姆级使用教程 简介 Cursor 是一款基于人工智能技术的代码生成工具。 它利用先进的自然语言处理和深度学习算法,可根据用户的输入或需求,自动生成高质量代码。 不管是初学者,还是资深开发者,Curs…

低代码技术:简化应用开发的未来

近年来,低代码技术作为一种新兴的应用开发方法,受到了广泛关注。低代码平台通过图形化的界面和预设的模块,使得用户能够以较少的代码编写工作创建应用程序。这一技术的发展,标志着软件开发过程中的一个重要变革。 低代码技术的基…

Koa (下一代web框架) 【Node.js进阶】

koa (中文网) 是基于 Node.js 平台的下一代 web 开发框架,致力于成为应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石; 利用 async 函数 丢弃回调函数,并增强错误处理,koa 没有任何预置的中间件,可快速…

二叉树的前中后序遍历(迭代法)( 含leetcode上三道【前中后序】遍历题目)

文章目录 前序遍历(迭代法)中序遍历(迭代法)后序遍历(迭代法)总结 为什么可以用迭代法(非递归的方式)来实现二叉树的前后中序遍历呢? 在队列与栈专题我们就感受到了&…

KeyCode及KeyCode分发机制

文章目录 需求场景纯KeyCode 快捷操作KeyCode 按键响应操作、拦截 一、工作中常用KeyCode二、KeyCode大全三、KeyCode 响应事件事件输入流程事件响应源码分析源码举例说明 需求场景 纯KeyCode 快捷操作 经常在代码中实现返回、Home 、音量加减、截屏 等功能实现,代…