Spring面试题记录?

请简述 Spring 框架的核心是什么?它主要包含了哪些核心模块?

spring的核心模块主要有spring-core(工具类,资源加载),spring-bean(bean的定义,创建,封装),spring-context。这几个模块就形成了spring的核心概念,容器化,控制反转,依赖注入。所谓容器化就是spring会在启动初始化根据一些策略比如web或者webflux去生产一个子类上下文,然后在初始化的过程中,填充容器工厂,bean通过控制反转的概率将自己定义交给容器中的bean工厂进行创建填充,然后通过依赖注入到其他需要目标bean的bean实例。
spring还提供了一个很重要的模块spring-aop+spring-aspects,通过jdk或者cglib反射生成bean的代理对象,创建AOP链,不仅解决了循环依赖,还为bean功能提供了无侵入增强。

Spring Boot 的主要目标是解决什么问题?它是通过哪些核心特性来实现这一目标的?

1.配置简易化:spring提供了yml配置,以及@SpringApplicationRun组合注解的自动配置,避免大量配置文件。
2.部署简易化:springboot里面内嵌了一些容器,比如tomcat,不需要额外部署单独的。
3.依赖简易化:集成了maven或gradle工具,通过依赖树解决依赖冲突。
4.开发简易化:通过springboot实现的自动配置注解和钩子函数,开发者可以通过spring.factories去实现自己的配置以及钩子。

自定义一个spring-starter中使用@Configuration的配置类,让其被spring扫描识别到有几种方式

1.spring.factories中的org.springframework.boot.autoconfigure.EnableAutoConfiguration=\添加自己的配置。
2.spring新版本创建META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,添加自己的配置
3.自定义@EnableYourStarter,@EnableYourStarter上添加@Import(YourAutoConfiguration.class),引入该starter的业务启动方法添加该注解,会自动注入import的类为bean。

请描述 Spring MVC 处理一个 HTTP 请求的核心工作流程

首先浏览器发送一个http请求,这个时候会先到springmvc的 Dispatcherservlet, Dispatcherservlet会调用handleMapping来解析该http请求所映射的handleMethod链,handleMethod链调用适配器执行contorller,执行业务完成后,如果业务添加了@ReponseBody会返回json格式数据,如果没有就会返回modleAndView给Dispatcherservlet,Dispatcherservlet会将其交给视图解析器,解析完后返回给浏览器。

Spring Framework 中的 Bean 作用域(Scope)有哪几种?请简要说明它们之间的区别。

有以下几种,单例,原型,请求,会话,应用。单例主要是bean就是以单例模式创建的,所有获取该bean的都是一个实例。原型就是每次都新建一个bean使用,不复用。请求主要是一次请求下会有一个实例bean,在请求生命周期结束死亡。会话是一次会话有一个实例bean,会话结束bean死亡。应用主要是一个应用上下文中有一个实例bean,应用生命周期结束死亡。

在 Spring Boot 中,@SpringBootApplication 注解是一个组合注解,它主要由哪三个核心注解组成?并请简要说明每个注解的作用。

@SpringbootConfiguration:@Configuration的别名,这个注解作用就是将该类标为配置类,保证内部@bean被容器解析。
@EnableAutoConfiguration:该注解是启用自动配置,将spring-starter中的通过spring.factories注册的配置条件化装配进来。
@ComponetScan:默认扫描当前包和子包所有的@Componet注解以及其派生注解,实现业务的业务bean自动扫描注入。

Spring 框架中,什么是事务传播行为(Transaction Propagation)?请列举并简要说明 PROPAGATION_REQUIRED 和 PROPAGATION_REQUIRES_NEW 这两种常见传播行为的区别。

事务传播行为主要是两个方法都有事务的情况下的调用中事务的策略,因为声明式事务时AOP实现的,所有调用都要基于代理对象进行,如果是required,就会继承老的事务,如果是requires_new被调用方的事务AOP会新建一个事务进行处理。特别注意的是,如果是分布式seata事务,是不推荐spring原生的事务注解的,如果需要使用也是使用required传播级别,因为seata分布式事务也是基于AOP实现的,只是优先级比spring事务低,将其包住了,如果用了requires_new的级别,会导致新建一个事务上下文,导致事务悬挂,该事务会新建一个seata事务分支,该新事务会单独提交,全局事务回滚的时候需要补偿。

Spring MVC 中的 @RestController 注解和 @Controller 和@RequstMapping注解有什么区别?

@RestController 时@ReponseBody和@Controller的组合,直接单独说明作用。@ReponseBody的作用是将告诉dispatherServlet跳过视图解析器,将返回值直接序列化返回给浏览器,而@Controller注解默认需要走视图解析,同时因为@Controller是@Componet的派生注解,自身也会注册成一个bean。@RequstMapping及其派生注解主要是提供给handleMapping注册成HandleMethod,对外暴露接口。

请解释 Spring 框架中 Bean 的生命周期。简要描述从创建到销毁的过程中,有哪些重要的扩展点(例如,你可以通过哪些方式介入这个过程)。

1.首先是bean定义的创建,创建填充好定义后,触发beanpostprocesser前置钩子,然后进入创建流程,该流程会首先创建初始bean,判断是否有循环依赖。
2.如果有循环依赖,需要将依赖bean的早期引用进入三级缓存,当前依赖bean注入时候创建依赖bean放入二级缓存方便当前bean注入,如果没有循环依赖就进入bean的填充环节,填充属性后,这里有可能是代理也有可能是原始对象。
3.属性填充完成后,立即触发aware函数调用将spring系统的引用拿给bean,方便bean使用容器内部东西。
4.触发initializingbean钩子函数进行bean处理。
5.执行beanpostprocesser后置钩子,这里执行如果有事务注解或者AOP注解的话,需要执行AOP链,判断当前是否有代理对象,如果没有,就添加,有就复用,增强事务能力或者切面能力。
6.钩子走完生成成品bean后,然后从三级缓存/二级缓存移除,将成品bean放入一级缓存开始使用,根据bean的作用域消亡。

请详细解释 Spring 是如何利用三级缓存来解决单例 Bean 的循环依赖问题的。

三级缓存存放创建bean的function,二级缓存放入早期引用,一级缓存放成品。首先将当前bean的早期引用放入三级缓存,发现有循环依赖,在三级缓存放入依赖bean的工厂function,在当前bean需要注入依赖bean的时候,从三级缓存找到依赖bean的function执行创建一个初始bean放入二级缓存,然后依赖bean进行初始化,在三级缓存找到当前bean工厂,依赖bean注入填充初始完毕从二级缓存移除到一级缓存,然后当前bean注入依赖bean,这个时候直接从一级缓存找到成品依赖bean,当前bean直接注入依赖bean并且初始化自己,就解决了循环依赖。

请详细说明 Spring 框架中的 BeanFactory 和 ApplicationContext 的区别。以及,在现代 Spring 应用中,我们几乎总是使用 ApplicationContext,这是为什么?

ApplicationContext来源于spring-context是IOC容器在spring的表现形式;而beanFactory来源于spring-bean,只是一个bean工厂,负责bean的管理。ApplicationContext里面包括一个beanfactory实例,实现了解耦,同时它可以拿到bean工厂完成对bean的一些前后置钩子,以及通过aware将IOC给到bean使用。
只使用ApplicationContext的原因主要在于,ApplicationContext才是spring对外给开发者暴露的容器,其中暴露的一些接口已经可以使用ApplicationContext的bean工厂能力了,相当于采用了外观模式,ApplicationContext有beanfactory的所有功能,并且除此之外还有额外拓展。

Spring 框架中,有哪些方式可以把一个类声明为一个 Bean?(即 Bean 的装配方式有哪几种?)

@Controller,@Service,@Componet,@Bean,@Configuration,其中@Controller,@Service,@Componet这种写在业务子文件夹里面可以被spring直接扫描,@Configuration可以搭配@Bean,让bean被发现。以及直接使用spring.factories利用spring的钩子注册bean.

Spring AOP 和 AspectJ 有什么区别?Spring AOP 是基于哪种方式实现的?它在什么情况下会选择使用 JDK 动态代理,什么情况下会选择 CGLIB?

spring aop是基于动态代理做的切面增强。而AspectJ是使用字节码增强的能力去增强功能,增强的jar属于另一个服务。如果是接口代理就会选择jdk动态代理,如果是类代理就是CGLIB代理

Spring 框架中,声明式事务管理(@Transactional)的工作原理是什么?请详细说明它是如何通过 AOP 和代理机制实现的,以及在什么情况下会失效。

spring的声明式事务是基于AOP做的,他在AOP的前置切面建立事务,在AOP的后置切面提交事务。如果你不通过代理对象去调用相关服务,AOP就会失效,比如直接this或者直接调用方法,这种就会调用原始对象。还有就是不符合AOP切面生成的,比如方法声明非public,这种就无法生成切面,事务也会失效。

Spring Framework 中如何管理多数据源的事务?在一个需要同时操作两个不同数据库的业务方法上,如何使用 Spring 事务保证数据一致性?请描述实现思路和需要注意的关键问题。

spring framework有所有数据源的事务管理器,如果需要跨数据源做事务有多种方式,1:使用编程式事务,在A,B两个数据源都成功的时候进行提交,如果其中一个提交成功,另一个失败,进行补偿处理。2.使用seata分布式事务AT或者TCC模式控制,使用AT模式结合本地事务添加注解自动处理事务,使用TCC模式通过三段式来保障事务一致性。3.不使用事务直接控制,直接通过补偿的方式写事务表,然后补偿任务。

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

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

相关文章

一次缓存引发的文件系统数据不一致问题排查与深度解析

01 起因EFC(Elastic File Client)是 NAS 自研的分布式文件系统客户端,最近完成了对缓存架构的更新,现在支持多个客户端之间构成分布式缓存,底层支持 NAS、CPFS 和 OSS。由于开发时间较短,一直没有做 NAS 场…

Spring Boot Gateway 教程:从入门到精通

一、Spring Cloud Gateway 简介Spring Cloud Gateway 是基于 Spring 5、Project Reactor 和 Spring Boot 2 构建的 API 网关,旨在为微服务架构提供一种简单而有效的路由管理方式。它取代了 Netflix Zuul,提供了更高效和更强大的网关解决方案。核心特点&a…

防火墙 只允许信任的几台服务器访问

1. 首先,确保 firewalld 服务正在运行:systemctl start firewalld systemctl enable firewall2. 设置默认拒绝规则:设置默认拒绝所有流量(拒绝所有的入站流量):firewall-cmd --zonepublic --add-rejectal…

十三,数据结构-树

定义树也是基于节点的数据结构,和链表不同的是,树的节点可以指向多个节点。首先对树的一些常用术语进行说明:最上面的节点叫做根节点,根位于树顶,如图中的节点A;和族谱一样,节点有后代和祖先&am…

JVM-默背版

1.JVM对sychronized的优化:锁膨胀、锁消除、锁粗化、自适应自旋锁 (1)锁膨胀:从无锁、偏向锁、轻量级锁、重量级锁的过程叫做锁膨胀。在JDK1.6以前,sychronized是由重量级锁实现的,加锁和解锁的过程需要从用…

Mac M 系列芯片 YOLOv8 部署教程(CPU/Metal 后端一键安装)

在 Mac M 系列芯片(Apple Silicon/ARM 架构)上部署 YOLOv8,有一些注意事项:PyTorch 需要安装 ARM 原生版本,推理可利用 Metal 后端加速 CPU。本文教你一步步完成环境配置、模型下载、依赖安装和验证推理。1️⃣ 环境准…

Python爬虫实战:研究Units模块,构建气象数据采集和分析系统

1. 引言 1.1 研究背景 随着信息技术的飞速发展,互联网已成为全球最大的信息库,涵盖气象、金融、医疗、农业等多个领域的海量数据。这些数据蕴含着巨大的潜在价值,如何有效获取并深入分析这些数据成为当下研究的热点。Python 作为一种功能强大的编程语言,凭借其丰富的库资…

网页设计模板 HTML源码网站模板下载

互联网已成为现代社会不可或缺的一部分,网站则是连接线上与线下世界的桥梁。无论是用于展示个人作品集、推广商业产品还是提供公共服务信息,一个设计精良且功能完善的网站都能发挥巨大作用。然而,传统的手工编码方式不仅耗时费力,…

Flink KeyedProcessFunction为什么能为每个key定义State和Timer?

问题描述 一个常见的开窗逻辑(12H 或者 500条): import org.apache.flink.api.common.state.ValueState; import org.apache.flink.api.common.state.ValueStateDescriptor; import org.apache.flink.api.common.typeinfo.Types; import or…

【C++】模版初阶---函数模版、类模版

🌟个人主页:第七序章 🌈专栏系列:C++ 目录 ❄️前言: 🌈1.泛型编程: 🌈2.函数模板 🍭2.1函数模板概念 🍭2.2函数模板格式 &am…

查找算法(Java)

目录 一.定义 二.分类 三.线性查找 原理: 思路分析 代码实现 例题实践 1.两数之和 方法一:暴力穷举法 思路分析 代码实现 方法二:创建哈希表 思路分析 代码实现 2.移动零 思路分析 代码实现 四.二分查找 原理: …

计算机网络--四层模型,IP地址和MAC地址

四层模型:分别是应用层,传输层,网络层和链路层。应用层:提供了应用程序之间相互通信的接口,允许用户访问网络服务。这一层定义了应用程序如何与底层网络进行交互。例如HTTP协议。传输层:它处理数据的分段、…

解析、创建Excel文件的开源库OpenXLSX介绍

OpenXLSX是一个C库,用于读取、写入、创建和修改.xlsx格式的Microsoft Excel文件,源码地址:https://github.com/troldal/OpenXLSX ,License为BSD-3-Clause,可在Windows、Linux、MaCOS平台上使用。最新发布版本为v0.3.2&…

【C++】C++11 篇二

【C】C11 篇二前言移动构造函数移动赋值运算符重载类成员变量初始化 (缺省值出自C11强制生成默认函数的关键字default:禁止生成默认函数的关键字delete:继承和多态中的final与override关键字(出自C11可变参数模板递归函数方式展开参数包逗号表达式展开参…

构建Python环境的几种工具

本文主要介绍如何构建Python环境来处理不同的工作。 1.常用的构建Python环境的工具 ①venv(内置模块):Python 3.3 内置标准库模块,无需额外安装。 ②virtualenv:venv的前身,功能更强大且支持旧版Python。 ③conda:来自 Anaconda 或 Miniconda。不仅能…

c#项目编译时外部依赖文件的同步问题

很多场景因为资源文件太多或太大无法放到资源里面或者是依赖的dll文件,需要编译时同步到bin\debug或bin\release下的,这里面要修改工程文件代码实现。 比如,我把这个项目依赖的dll和附加文件放到ref_dll文件夹里面,希望编译的时候…

数学建模常用算法-模拟退火算法

一、模拟退火算法模拟退火的灵感来源于物理中的 “退火过程”—— 将金属加热到高温后,缓慢冷却,金属原子会在热能作用下自由运动,逐渐形成能量最低的稳定结构。算法将这一过程抽象为数学模型:“温度 T”:对应物理中的…

架构很简单:业务架构图

缘起业务架构是一个复杂的体系,如何更简单的表达,并能使用起来呢?所谓:大道至简。基于此,这篇文章就开始了。业务是一切架构的开始,如果没有业务,架构又有什么作用呢?所以做架构首先…

【前端埋点】纯前端实现 A/B Test

“纯前端实现 A/B Test”,意思就是 没有后端分流、也不依赖流量网关,那么只能靠前端逻辑来做“流量切分”。 🎯 目标 80% 的用户 → A 页面20% 的用户 → B 页面且要保证 同一个用户每次访问结果一致(否则用户刷新页面时 A/B 会跳…

Day22_【机器学习—集成学习(3)—Boosting—Adaboost算法】

Adaptive Boosting(自适应提升)是基于 Boosting思想实现的一种集成学习算法,核心思想是通过逐步提高那些被前一步分类错误的样本的权重来训练一个强分类器。一、Adaboost算法直线相当于一个弱学习器,正确的数据权重减小,错误的数据权重增加二…