spring高频面试题

news2024/11/25 19:37:29

什么是IOC

Spring框架提供的一种容器,用于控制对象的创建和对象之间的调用,通过IOC容器把对象的创建和调用过程交给Spring进行管理,省去了使用 new的方式创建对象。
所谓依赖注入(DI),就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中,得出依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。

什么是AOP

面向切面编程,用于将业务无关却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用降低耦合。

aop实现:主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关"方面"的代码。

spring实现AOP

1、jdk动态代理:代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理;其核心的两个类是InvocationHandler和Proxy。

2、CGLIB动态代理:实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB是高效的代码生成包,底层是依靠ASM(开源的java字节码编辑类库)操作字节码实现的,性能比JDK强;需要引入包asm.jar和cglib.jar。

aop使用场景

记录操作日志、缓存、spring事务等

记录操作日志:使用aop中的环绕通知+切点表达式(记录日志的方法),通过环绕通知的参数获取请求方法的参数(类、方法、注解、请求方式等)并保存到数据库。

spring aop

spring事务是如何实现的

本质是通过aop实现的,对方法前后进行拦截。在执行方法之前开启事务,在执行目标方法之后根据方法的执行情况提交或回滚事务。

spring事务失效场景

情况1:异常捕获处理(try—catch)
原因:事务通知只有捕捉到目标抛出的异常,才能进行回滚处理。若目标自己处理掉异常,事务通知捕捉不到异常,自然就无法执行回滚操作。

情况2:抛出检查异常
原因:spring默认只会回滚非检查异常
解决方案:配置rollbackFor 属性 @Transactional(rollbackFor = Exception.class)

检查异常和非检查异常的区别

Java中的异常分为两种:检查异常和非检查异常 / 运行时异常,具体的区别如下:

检查异常是指需要在编译时使用try-catch或者throws声明的异常,如果不处理将无法编译通过。如IOException、ClassNotFoundException等。

非检查异常 / 运行时异常是指在编译时不需要try-catch或者throws声明的异常,在程序运行期间会抛出。如NullPointerException、ArrayIndexOutOfBoundsException等

情况3:事务方法访问修饰符非public,导致事务失效
原因:spring为方法创建代理、添加事务通知的前提是该方式是public的

spring框架中的单例bean时线程安全的吗?

不是线程安全的。

spring框架中有一个@Scope注解,默认的值是singleton(单例的)

因为一般注入IOC容器中的bean都是无状态的对象,没有线程安全问题,若bean中定义了可修改的成员变量,那么就要考虑线程安全问题,可以用prototype(多例)或者加锁来解决。

Bean的生命周期
在这里插入图片描述
Bean的生命周期

1、 通过BeanDefinition获取bean的定义信息

2、调用构造函数实例化bean

3、bean的依赖注入

4、处理Aware接口(BeanNameAware、BeanFactoryAware、ApplicationContextAware)

5、Bean的后置处理器BeanPostProcessor-前置

6、初始化方法(InitializingBean、init-method)

7、Bean的后置处理器BeanPostProcessor-后置

8、销毁bean

bean的生命周期

spring的循环依赖

spring的循环依赖及其解决方案

Spring MVC的执行流程

视图阶段(jsp):前后端不分离
在这里插入图片描述执行流程

  1. 用户发送请求到DispatcherServlet(前端控制器)
  2. DispatcherServlet收到请求后调用HandlerMapping(处理器映射器)
  3. HandlerMapping找到具体的处理器,生成处理器对象及处理器拦截器(如果有),一起返回给DispatcherServlet
  4. DispatcherServlet调用HandlerAdapter(处理器适配器)
  5. HandlerAdapter经过适配调用具体的处理器(Handler/Controller)
  6. Controller执行完成后返回ModelAndView对象
  7. HandlerAdapter将Controller的执行结果(ModelAndView对象)返回给DispatcherServlet
  8. DispatcherServlet将ModelAndView传给ViewResolver(视图解析器)
  9. ViewResolver解析后返回具体的View(视图)
  10. DispatcherServlet根据View渲染视图(将模型视图填充到视图中)
  11. DispatcherServlet响应View给用户

SpringBoot自动配置原理

@SpringBootApplication

// @SpringBootApplication里面包含的注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)

@SpringBootConfiguration :此注解作用与@Configuration注解相同,用来表明当前类是一个配置类

@ComponentScan :组件扫描,默认扫描当前引导类及其子包

△@EnableAutoConfiguration:Springboot实现自动配置的核心注解
在这里插入图片描述面试回答:在springboot项目中的引导类上有个注解@SpringBootApplication,这个注解封装了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan等注解,其中@EnableAutoConfiguration注解是Springboot实现自动配置的核心注解,该注解通过@Import注解导入对应的配置选择器(@Import({AutoConfigurationImportSelector.class}))

内部读取了org.springframework.boot:spring-boot-autoconfigure包下的classpath路径下META-INF/spring.factories文件中的配置类的全类名。在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到IOC容器中

条件注解如@ConditionalOnClass等,这个注解的作用判断是否有对应的class文件,若有则加载此类,将这个配置类所有的Bean放入IOC容器中。

spring框架的常用注解

spring的常用注解

注解说明
@Component、@Controller、@Service、@Repository使用在类上用于实例化Bean
@Autowired使用在属性上根据类型进行依赖注入
@Qualifier结合@Autowired一起使用,根据名称进行依赖注入
@Scope标注bean的作用域
@Configuration指定当前类为一个配置类
@ComponentScan用于spring在初始化容器时扫描的包
@Bean标注在方法上,表示将该bean添加到spring容器
@Import使用@Import导入的类会被加载到spring容器
@Aspect、@Before、@after、@Around、@Pointcut用于aop 详见

① bean的作用域

作用域描述
singleton(默认)将单个 bean 定义限定为每个 Spring IoC 容器的单个对象实例。
prototype将单个 bean 定义限定为任意数量的对象实例
request将单个 bean 定义限定为单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有自己的 bean 实例,该实例是在单个 bean 定义的后面创建的。仅在web类型的 ApplicationContext有效。
session将单个 bean 定义限定为 HTTP 会话的生命周期。仅在web类型的 ApplicationContext有效。
application将单个 bean 定义限定为 ServletContext 的生命周期。仅在web类型的 ApplicationContext有效。
websocket将单个 bean 定义限定为 WebSocket 的生命周期。仅在web类型的 ApplicationContext有效。

spring mvc常用注解

注解说明
@RequestMapping用于请求映射路径,可以用在方法或类上。用在类上表示当前类中所有的方法都以此路径为父路径
@RequestBody接收http请求的JSON数据,将JSON转换成java对象
@RequestParam指定请求参数的名称,如:/user?name=hh 请求中的name属性@RequestParam(“name”)
@PathViriable从请求路径下获取请求参数,如:/user/{id} 使用@PathViriable("id)
@ResponseBody将返回对象转换成JSON数据并响应给前端
@RequestHeader获取指定的请求头
@RestController等价于@Controller + @ResponseBody

springboot常用注解

注解说明
@SpringBootConfiguration组合了@Configuration注解,实现文件配置功能
@EnableAutoConfiguration打开或关闭自动配置功能
@ComponentScanspring组件扫描

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

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

相关文章

生态系统模型:SolVES、DNDC、CMIP6、GEE林业、APSIM、InVEST、无人机遥感、ArcGIS Pro模型等

基于R语言APSIM模型高级应用及批量模拟实践技术 CMIP6 数据处理方法与典型案例分析实践技术 Python 与 Noah-MP 陆面过程模型融合技术及在站点、区域模拟实践应用 双碳目标下基于“遥感”融合技术在碳储量、碳收支、碳循环等多领域监测与模拟实践应用 基于Citespace和vosvi…

扩展定时器功能说明

计数和定时 ⚫ 16bit upcounter ⚫ 上升沿或下降沿计数 ⚫ 计数初值和终值可配置 ⚫ 计数值大于等于比较值时触发中断 ⚫ 计数溢出后自动重载 ⚫ 计数周期中可以通过改写重载寄存器修改下一周期长度 支持16bit计数或级联的32bit计数。当CNTSEL0,计数器为16bit&#…

快手新财报:曙光就在冲刺路上?

自短视频爆火以来,短视频行业的头部玩家——抖音和快手就迎来了飞速发展,甚至一度成为了国民“杀时间利器”。然而,随着互联网红利逐渐见顶,短视频行业竞争加剧,哪怕作为头部玩家,快手的日子也并不好过。 …

Tatuk GIS Developer Kernel for .NET 11.77 Crack

Tatuk GIS Developer Kernel for .NET 是一个变体,它是受控代码和 .NET GIS SDK,用于为用户 Windows 操作系统创建 GIS 专业软件的过程。它被认为是一个完全用于 Win Forms 的 .NET CIL,WPF 的框架是为 C# 以及 VB.NET、VC、oxygen 以及最终与…

Learn From Microsoft Build Ⅰ:OpenAI

点击蓝字 关注我们 编辑:Alan Wang 排版:Rani Sun 微软 Reactor 为帮助广开发者,技术爱好者,更好的学习 .NET Core, C#, Python,数据科学,机器学习,AI,区块链, IoT 等技术&#xff0…

android性能测试-内存详解

Android性能测试-内存详解 名称说明Native HeapNative代码分配的内存,虚拟机和Android框架分配内存。关于什么是Native代码,即非Java代码分配的内存。Dalvik HeapJava对象分配的占据内存Dalvik Other类数据结构和索引占据内存Stack栈内存Other dev内部dr…

盐城北大青鸟东台基地IT精英挑战赛设计类作品展示

北大青鸟IT精英挑战赛作品展示——《黄小果》 这是我们22级新生王欣怡的作品,她是一位很优秀的 学生,经过一年的学习能够熟练的制作表情包

怎样让GPT教我用Python进行数据可视化

文章目录 怎样让GPT教我用Python进行数据可视化matplotlibpyecharts总结 怎样让GPT教我用Python进行数据可视化 🚀🚀首先,我们先看一下这段代码,这是我之前写来读取excel文件中xx大学在各个类别中的获奖情况,并保存在…

机器学习之机器如何学习

通过Julia的语法、函数、编译器使机器学习技术变得更加简单。 1、机器学习如何工作 通过机器学习,研究人员可以构造算法,使计算机自身能够在大量的数据中找到数学模式,而这是人类不可能做到的。想想看: 如果我问你,你怎么知道一张…

Padstack editor 绘制SMD Pin,Thru Pin和Via

一,椭圆形状的SMD PIN 的创建(例如:0.55/0.23 补偿后 0.95/0.28) 1,在select padstack usage 中选择 SMD Pin ;select pad geometry中选择 Oblong; 2,先将左下角 decimal places中的值设置为2&…

Java内部类(成员内部类、局部内部类、静态内部类、匿名内部类)

目录 ①. 什么是内部类 ②. 内部类的共性 ③. 为什么需要内部类 ④. 成员内部类 ⑤. 局部内部类 ⑥. 静态内部类(嵌套类) ⑦. 匿名内部类 ①. 什么是内部类 内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并…

C++常用的支持中文的GUI库Qt 6之三: 项目的发布

C常用的支持中文的GUI库Qt 6之三: 项目的发布 本文接着上一篇“C常用的支持中文的GUI库Qt 6之二:项目的结构、资源文件的使用” https://blog.csdn.net/cnds123/article/details/130741807介绍,并使用其中的例子。 程序代码能正确编译运行&…

1. Tomcat整体架构及其设计精髓分析

MySQL性能调优 1.Tomcat的整体架构1.1 Tomcat介绍1.1.1 Servlet基础回顾 1.2 目录结构1.3 web应用部署的方式1.4 结合Server.xml理解Tomcat架构1.5 架构图 2. Tomcat核心组件详解2.1 Server 组件2.2 Service组件2.3 连接器Connector组件2.3.1 ProtocolHandler 组件2.3.1.1 EndP…

全志V3S嵌入式驱动开发(移植linux kernel和rootfs)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 除了少部分嵌入式设备使用vxworks和freertos之外,大部分嵌入式都是使用linux来做基础os来使用的。linux使用场景很多,除了大…

智慧城市同城V4小程序V2.24独立开源版 + 全插件+VUE小程序开源前端+最新用户授权接口

智慧城市同城V4小程序V2.22开源独立版本月最新版,与上一版相比修复了一些小细节,功能本身并无大的变化。新版系统包含全插件、包括很多稀缺收费的插件都在里面如括招聘、 家政等,外加小程序的VUE开源前端,整个系统全开源&#xff…

chatgpt赋能python:PythonTic:了解一种强大的测试框架

Python Tic: 了解一种强大的测试框架 当你编写代码时,测试通常是不可或缺的一部分。Python Tic是一个出色的测试框架,它可以帮助您自动化测试和验证您的代码。 简介 Python Tic是一种基于Python的测试框架,它能够测试您的代码的各个方面&a…

鹅厂程序员的9个生存法则

👉腾小云导读 本文作者在腾讯多年,主要从事的是腾讯云CDN、EdgeOne产品的后台研发工作。作者在云计算领域遇到了不少代码设计和程序设计的问题,他对于如何把项目中的代码标准化、提高开发维护的效率,做了总结梳理。本篇为各位分享…

解密Java Class文件不为人知的秘密

Java 诞生多年,因此在网络上,有关 Java Class 文件格式解析的文章有很多,但他们大多数都是在列举《Java 虚拟机》中定义的格式,通读下来,好像所有的东西都讲清楚了,但是我个人好像并没有看懂,不…

舵机云台实现体感姿态跟随功能

1. 功能说明 本文示例将实现R207样机舵机云台根据六轴陀螺仪传感器数据实现姿态跟随的功能。 2. 电子硬件 在这个示例中,我们采用了以下硬件,请大家参考: 主控板 Basra主控板(兼容Arduino Uno)‍ 扩展板 Bigfish2.1扩…

【012】C++循环控制语句 for 和 while 详解

C循环控制语句 for 和 while 详解 引言一、循环控制语句 for1.1、for 循环语句1.2、break和continue1.3、for循环的嵌套 二、循环控制语句while2.1、while循环语句2.2、break和continue2.3、do...while()循环语句 总结 引言 💡 作者简介:专注于C/C高性能…