Spring 高频面试题及详细真实答案(实战版)_第1页
Spring 高频面试题及详细真实答案(实战版)_第2页
Spring 高频面试题及详细真实答案(实战版)_第3页
Spring 高频面试题及详细真实答案(实战版)_第4页
Spring 高频面试题及详细真实答案(实战版)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Spring高频面试题及详细真实答案(实战版)一、Spring基础核心面试题1.谈谈你对Spring框架的理解?Spring是一款轻量级的Java开发框架,核心目的是简化企业级Java开发,降低代码耦合度,让项目开发、维护、扩展更便捷。它最核心的两大思想是IOC控制反转和AOP面向切面编程。除此之外,Spring还提供了事务管理、Bean管理、依赖注入、事件机制等基础能力,并且可以无缝整合MyBatis、Redis、MQ等各类主流框架和中间件,是Java后端开发的基础框架。和传统Java开发相比,Spring把对象的创建、管理、销毁全部交给容器,开发者只需要专注业务逻辑,不用手动维护对象依赖,极大提升了开发效率。2.Spring的核心组件有哪些?各自作用是什么?Spring核心四大组件是Bean、Context、Core、Expression,日常开发最核心的是前三者:Core核心模块:Spring最基础的底层支撑,提供框架的基础工具类、资源加载、类型转换等底层能力,是所有模块的基础。Bean模块:专门负责Bean的生命周期管理、Bean的创建、依赖注入、作用域控制,是IOC容器的核心实现。Context上下文模块:基于Core和Bean构建,是Spring容器的具体实现,提供了容器运行环境、事件发布、国际化、资源读取等能力,我们常用的ApplicationContext就属于这个模块。Expression表达式模块:提供SpEL表达式语法,支持在配置文件、注解中动态赋值、取值,满足灵活的配置需求。3.Spring和SpringMVC、SpringBoot的区别与联系?三者是层层递进、包含的关系,很多开发者容易混淆,实际定位完全不同:Spring:是核心基础框架,提供IOC、AOP、事务等核心能力,不专注Web开发,是后面两者的底层基础。SpringMVC:是Spring的Web组件,属于Spring的子框架,专门用来做MVC分层的Web开发,负责请求分发、参数解析、视图跳转、接口响应,是传统SSM架构的核心Web框架。SpringBoot:不是新框架,是Spring+SpringMVC的快速开发脚手架。它解决了Spring项目配置繁琐、依赖冲突、部署麻烦的问题,通过自动配置、starter依赖、内嵌容器,实现零配置、快速搭建项目。简单总结:Spring是底层核心,SpringMVC做Web接口开发,SpringBoot简化Spring项目搭建和配置。二、IOC与Bean核心面试题(高频)4.什么是IOC控制反转?为什么叫反转?IOC全称控制反转,是Spring的核心设计思想,本质是将对象的创建、依赖管理、生命周期控制权,从开发者代码中转移到Spring容器。传统开发中,我们需要使用对象时,要自己new对象、手动赋值依赖,对象的控制权在程序员手里;而使用Spring后,我们只需要通过注解或配置声明依赖,容器会自动创建对象、自动注入依赖、自动销毁对象。所谓“反转”,指的是控制权反转:原本由开发者主动创建对象,现在由容器主动推送对象给程序,程序被动接收依赖,这就是控制反转。5.什么是DI依赖注入?DI和IOC的关系?DI依赖注入是IOC的具体实现方式。IOC是设计思想,DI是落地手段。依赖注入就是Spring容器在创建Bean的时候,自动将当前Bean需要的依赖对象,赋值注入进去,无需开发者手动赋值。Spring支持三种注入方式:构造器注入:通过类的构造方法注入,Spring官方推荐,能保证对象初始化完成后依赖一定存在,避免空指针,同时支持不可变对象。Setter方法注入:通过set方法注入,适合可选依赖、动态修改依赖的场景。字段注入(@Autowired):最简写,日常开发常用,但不推荐过度使用,容易导致类依赖臃肿,不利于单元测试。6.SpringBean的生命周期?详细执行流程?SpringBean完整生命周期分为6个核心步骤,面试必须答全,真实执行顺序如下:实例化:Spring容器扫描配置,通过反射创建Bean的空对象实例,此时对象已存在,但属性都是默认值,还没有赋值依赖。依赖注入:容器根据配置,完成属性赋值、依赖对象注入(@Autowired、构造器注入等)。前置初始化处理:执行Bean后置处理器的前置方法(BeanPostProcessorbefore),可以对Bean做前置修改、增强。初始化:先执行InitializingBean的afterPropertiesSet方法,再执行自定义的init-method初始化方法,完成业务初始化逻辑。后置初始化处理:执行Bean后置处理器的后置方法(BeanPostProcessorafter),我们熟知的AOP动态代理就是在这一步完成的。销毁:容器关闭时,执行DisposableBean的destroy方法或自定义destroy-method,释放资源、关闭连接等。补充:单例Bean在容器启动时创建,随容器销毁;多例Bean在每次使用时创建,容器不负责销毁。7.SpringBean的作用域有哪些?常用的区别?Spring提供6种Bean作用域,开发中最常用的是前两种:singleton(单例,默认):整个Spring容器中只存在一个Bean实例,容器启动时初始化(懒加载除外),所有请求共享同一个对象。适合工具类、服务层Bean(Service、Mapper)。注意:单例Bean非线程安全,不能定义成员变量存储请求数据。prototype(多例):每次从容器获取Bean时,都会创建一个全新的实例。适合有成员变量、非线程安全的Bean。request:每次HTTP请求创建一个Bean,请求结束销毁。session:每个用户会话对应一个Bean,会话过期销毁。application:整个Web应用全局一个实例,和ServletContext生命周期一致。websocket:每个WebSocket连接对应一个Bean。8.Spring单例Bean为什么是线程不安全的?怎么解决?Spring的单例Bean是容器级单例,非线程单例。整个容器只有一个对象实例,如果Bean中定义了成员变量,多个线程同时访问、修改这个成员变量时,就会出现线程安全问题。解决方式:尽量不要在Service、Controller中定义可变成员变量;需要存储变量时,使用ThreadLocal绑定当前线程;将Bean改为多例作用域(prototype),不推荐滥用,会造成资源浪费;使用同步锁处理临界资源(性能较差,优先前两种)。9.Spring循环依赖是什么?怎么解决的?循环依赖场景:A类依赖B类,B类又依赖A类,容器创建Bean时会出现互相依赖、无法初始化的问题。Spring支持的循环依赖:仅支持Setter/字段注入的单例Bean循环依赖;构造器注入的循环依赖无法解决,会直接报错。核心解决原理:三级缓存Spring通过三个Map缓存Bean实例,分步解决循环依赖:一级缓存(singletonObjects):存放完全初始化完成、可直接使用的单例Bean;二级缓存(earlySingletonObjects):存放已实例化、但还未完成依赖注入和初始化的半成品Bean;三级缓存(singletonFactories):存放Bean的工厂对象,用于提前暴露Bean引用,解决代理对象循环依赖问题。执行流程:创建A时,先实例化A,将A的工厂对象放入三级缓存,再去注入依赖B;创建B时需要A,从三级缓存获取A的半成品引用完成注入,B初始化完成后放入一级缓存;最后A完成剩余初始化,存入一级缓存,彻底解决循环依赖。三、AOP面向切面编程面试题10.什么是AOP?应用场景有哪些?AOP面向切面编程,是Spring另一大核心思想,核心是在不修改原有业务代码的前提下,对方法进行增强,实现代码解耦。简单说:把项目中通用的、重复的逻辑(日志、权限、事务、限流)抽离成切面,在目标方法执行前后统一执行,不用在每个业务方法中重复写代码。常见应用场景:统一日志记录(接口入参、出参、异常日志);统一权限校验、接口拦截;事务控制、方法重试;接口耗时统计、性能监控;缓存更新、数据脱敏。11.AOP核心术语有哪些?切面(Aspect):封装通用逻辑的类,也就是我们写的切面类;连接点(JoinPoint):可以被切面拦截的所有方法,Spring中仅支持方法级别的连接点;切入点(Pointcut):从所有连接点中筛选出的、需要真正拦截的方法;通知(Advice):切面具体执行的增强逻辑,分为前置、后置、异常、最终、环绕通知;目标对象(Target):被切面拦截的原始业务对象;代理对象(Proxy):Spring生成的目标对象的代理对象,用来实现方法增强。12.SpringAOP的动态代理机制?JDK代理和CGLIB代理区别?SpringAOP底层依靠动态代理实现方法增强,有两种代理方式:JDK动态代理基于接口实现,只能代理实现了接口的类,通过接口生成代理对象,性能较高,无需依赖第三方包。CGLIB动态代理基于子类继承实现,可以代理没有接口的普通类,通过生成目标类的子类重写方法实现增强。无法代理被final修饰的类和方法。Spring代理规则Spring5.2之后,默认优先使用CGLIB;无论类是否实现接口,默认都是CGLIB代理,保证统一的代理逻辑。13.AOP五种通知的执行顺序?正常无异常执行顺序:环绕前置通知→前置通知→目标方法执行→后置返回通知→后置最终通知→环绕后置通知目标方法异常执行顺序:环绕前置通知→前置通知→目标方法报错→异常通知→后置最终通知(后置返回、环绕后置不执行)四、Spring事务核心面试题(重中之重)14.Spring事务的实现原理?Spring事务基于AOP动态代理实现,属于声明式事务,核心逻辑:当方法上加了@Transactional注解后,Spring会为当前类生成代理对象,在方法执行前开启事务,方法正常执行完毕后提交事务,方法抛出异常时回滚事务,全程无需手动编写事务开启、提交、回滚代码。底层依赖数据库的事务机制,Spring只是对数据库事务做了统一封装和管理。15.Spring事务的传播属性有哪些?常用场景?Spring一共7种传播属性,面试重点掌握5个常用的:REQUIRED(默认):如果当前有事务,加入当前事务;如果没有,新建事务。最常用,适配绝大多数业务场景。SUPPORTS:有事务就加入,没事务就非事务执行。适合查询方法。MANDATORY:必须在事务中执行,没有事务直接报错。REQUIRES_NEW:无论当前是否有事务,都新建一个独立事务,旧事务挂起。适合独立日志记录、异步记录,不受主事务回滚影响。NESTED:嵌套事务,有父事务则嵌套在父事务中,仅保存子事务savepoint,子事务回滚不影响父事务,父事务回滚子事务必须回滚;无父事务则新建事务。16.Spring事务的隔离级别?解决什么问题?数据库事务存在三大问题:脏读、不可重复读、幻读,Spring基于数据库提供5种隔离级别:DEFAULT(默认):使用底层数据库默认隔离级别(MySQL默认可重复读,Oracle默认读已提交)。READ_UNCOMMITTED(读未提交):允许读取未提交数据,会出现脏读、不可重复读、幻读,基本不用。READ_COMMITTED(读已提交):只能读取已提交数据,解决脏读,存在不可重复读、幻读。Oracle默认级别。REPEATABLE_READ(可重复读):保证同一事务多次读取数据一致,解决脏读、不可重复读,存在幻读。MySQL默认级别。SERIALIZABLE(串行化):最高级别,串行执行事务,解决所有并发问题,性能极差,几乎不使用。17.Spring事务失效的常见场景?(高频面试坑点)实际开发中90%的事务失效都是以下5种情况,面试必问:方法非public修饰:SpringAOP只能拦截public方法,private、protected方法的@Transactional完全失效。内部调用导致失效:同一个类中,A方法(无事务)直接调用本类B方法(有事务),不会走代理对象,事务失效。解决方式:通过代理对象调用(AopContext)或拆分类。异常类型不匹配:默认事务只回滚RuntimeException、Error;如果是普通Exception检查异常,不回滚。需要手动配置rollbackFor=Exception.class。异常被手动捕获:方法内部try-catch捕获了所有异常,没有向外抛出,Spring无法感知异常,不会触发回滚。多线程事务失效:Spring事务基于ThreadLocal绑定当前线程,子线程无法获取主线程事务,多线程操作数据库无法保证事务一致性。五、Spring高频易错面试题18.@Autowired和@Resource的区别?两者都是依赖注入注解,核心区别是注入规则、来源、默认匹配方式:@Autowire

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论