版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Spring核心面试题及详细答案(高频完整版)一、Spring基础核心面试题1.简单说说你对Spring框架的理解,Spring的核心作用是什么?参考答案:Spring是一款轻量级的Java开源分层框架,也是目前Java后端最主流的开发框架,核心目的是简化企业级Java开发,降低代码耦合度,解决传统J2EE开发臃肿、繁琐、高耦合的问题。它不局限于某一层开发,而是贯穿JavaWeb开发的表现层、业务层、持久层,核心功能可以概括为两点:1.解耦:通过IOC容器管理对象,把对象的创建、依赖、销毁全部交给框架管理,无需手动new对象,彻底解除组件间的硬编码耦合;2.增强功能:通过AOP实现无侵入式功能扩展,比如事务控制、日志记录、权限校验等,不用修改业务代码就能实现功能增强。除此之外,Spring还提供了统一的事务管理、异常处理、资源管理等通用能力,同时兼容各类主流框架,极大提升开发效率。2.Spring的核心组件有哪些?各自的作用是什么?参考答案:Spring最核心的四大组件是IOC容器、AOP、事务管理、SpringMVC,日常开发核心依赖前两者:1.IOC(控制反转)容器:Spring的核心核心,负责Bean的创建、初始化、依赖注入、生命周期管理、对象销毁,统一管理项目中所有组件对象;2.AOP(面向切面编程):基于动态代理实现的代码增强机制,用于在不修改原有业务代码的前提下,对方法进行拦截增强,常用在事务、日志、监控、权限场景;3.事务管理:提供声明式事务和编程式事务,统一管理数据库事务,解决数据一致性问题,支持事务传播、隔离级别配置;4.SpringMVC:Spring的Web层框架,基于MVC架构模式,负责请求分发、参数解析、视图渲染、响应处理,是SpringBootWeb开发的基础。3.Spring常用的版本区别,Spring5和Spring4的核心差异?参考答案:1.Spring4:主流稳定老版本,全面支持注解开发,兼容Java7、Java8,是SpringBoot1.x的底层依赖,性能稳定,适配绝大多数传统项目;2.Spring5:全新迭代版本,核心改动较大,最低支持Java8,放弃了对Java6、Java7的兼容,同时移除了大量过时类和方法;最大的更新是引入响应式编程(WebFlux),支持异步非阻塞Web开发,适配高并发场景,也是SpringBoot2.x、3.x的底层核心依赖。二、IOC容器核心面试题(高频重点)1.什么是IOC(控制反转)?反转的是什么控制?参考答案:IOC全称控制反转,是Spring的核心设计思想。传统开发中,开发者主动通过new创建对象、管理对象依赖关系,控制权在开发者手中。而IOC就是把对象的创建、依赖装配、生命周期管理的控制权,从开发者代码反转交给Spring容器。简单说:主动创建变为被动接收。我们只需通过注解或配置声明依赖,容器会自动创建对象、注入依赖,彻底解耦。很多人会混淆IOC和DI:IOC是思想,DI(依赖注入)是实现IOC的具体手段。2.依赖注入(DI)的三种方式,各自优缺点?项目中常用哪种?参考答案:Spring支持三种依赖注入方式:构造器注入、setter方法注入、字段注入(注解注入)。1.字段注入(@Autowired)直接在类属性上加注解注入依赖,写法最简单、代码最简洁,是日常开发最常用的方式。缺点是容易产生循环依赖,对象依赖关系不直观,不利于代码解耦和单元测试。2.setter方法注入通过set方法注入依赖,适合可选依赖、动态变更的依赖。优点是对象创建后可动态修改依赖;缺点是依赖不保证必填,可能出现空指针,依赖关系分散。3.构造器注入通过类构造方法注入所有依赖,是Spring官方推荐的注入方式。优点:保证对象初始化时依赖全部就绪,避免空指针,依赖关系清晰,完全支持不可变对象,有效避免循环依赖;缺点是依赖过多时构造方法会臃肿。项目实操总结:必填依赖用构造器注入,可选依赖用setter注入,简单业务场景可使用字段注入。3.SpringBean的生命周期详细流程?参考答案:SpringBean的生命周期是面试高频考点,完整流程分为6步,从容器启动到对象销毁:1.实例化:Spring容器启动,扫描所有Bean配置,通过反射创建Bean的实例对象(此时只是空对象,没有属性赋值);2.属性填充(依赖注入):容器解析Bean的依赖,完成属性赋值、自动注入,装配所有依赖对象;3.初始化前置处理:执行Bean的后置处理器(BeanPostProcessor)的前置方法,对Bean进行预处理;4.初始化:先执行InitializingBean的afterPropertiesSet方法,再执行自定义的init-method初始化方法;5.初始化后置处理:执行BeanPostProcessor的后置方法,完成Bean的最终增强;6.销毁:容器关闭时,执行DisposableBean的destroy方法和自定义的destroy-method方法,释放资源。核心总结:实例化->赋值->前置处理->初始化->后置处理->销毁4.SpringBean的作用域有哪些?默认作用域是什么?参考答案:Spring官方提供6种Bean作用域,日常开发常用2种:1.singleton(单例):默认作用域,整个Spring容器中只创建一个Bean实例,全局共享,容器启动时初始化(非懒加载),性能最高,绝大多数业务Bean使用该作用域;2.prototype(多例):每次从容器获取Bean时,都会创建一个全新的实例,适合有状态的Bean,容器不会管理多例Bean的销毁生命周期;3.request:一次HTTP请求对应一个Bean实例,仅Web环境生效;4.session:一个用户会话对应一个Bean实例,仅Web环境生效;5.application:一个Web应用对应一个Bean实例;6.websocket:一个WebSocket连接对应一个Bean实例。重点注意:单例Bean是容器单例,不是线程单例,多线程并发场景下,单例Bean的非静态成员变量会存在线程安全问题。5.Spring如何解决循环依赖问题?哪些场景无法解决?参考答案:循环依赖就是两个或多个Bean互相依赖对方,比如A依赖B、B依赖A。1.Spring的解决方案(三级缓存)Spring通过三级缓存机制解决单例模式下、setter/字段注入的循环依赖:•一级缓存:存放完全初始化好的完整Bean;•二级缓存:存放已实例化、但未完成属性填充的半成品Bean;•三级缓存:存放Bean的工厂对象,用于提前暴露Bean实例。核心原理:Bean实例化后,提前将半成品Bean放入三级缓存,后续依赖它的Bean可以直接获取,避免重复创建,等待所有依赖装配完成后,再完成初始化。2.无法解决的循环依赖场景•多例Bean的循环依赖:多例Bean不进入缓存,无法提前暴露实例;•构造器注入的循环依赖:构造器在实例化阶段就需要依赖对象,此时还没有半成品Bean,无法缓存;•代理对象的循环依赖(部分场景):初始化完成后才会生成代理,提前暴露的是原对象,会导致依赖异常。三、AOP核心面试题1.什么是AOP?AOP的应用场景有哪些?参考答案:AOP是面向切面编程,是一种横向代码增强的思想,核心是在不修改原有业务代码的前提下,对方法进行拦截、增强、扩展功能。传统OOP是纵向继承扩展,AOP是横向切面拦截,专门处理项目中的通用公共逻辑,将公共逻辑与核心业务逻辑解耦。常用应用场景:1.数据库事务控制(@Transactional底层基于AOP);2.统一日志记录(方法入参、出参、异常日志);3.接口权限校验、登录拦截;4.方法性能监控、耗时统计;5.缓存拦截、数据脱敏、重复提交拦截。2.AOP的核心术语解释(切面、切入点、通知、连接点)参考答案:1.连接点(JoinPoint):可以被拦截的所有方法,项目中所有业务方法都是连接点;2.切入点(Pointcut):从所有连接点中筛选出的、需要真正拦截的方法,通过表达式匹配;3.通知(Advice):拦截方法后需要执行的增强逻辑,分为前置、后置、异常、最终、环绕通知;4.切面(Aspect):切入点+通知的结合体,包含拦截规则和增强逻辑的完整类;5.织入(Weaving):将切面增强逻辑植入目标方法的过程。3.SpringAOP的动态代理两种方式及区别?参考答案:SpringAOP底层基于两种动态代理实现,会自动适配,无需手动指定:1.JDK动态代理基于接口实现,要求目标类必须实现接口,只能代理接口中的方法,底层依赖JDK原生API,无第三方依赖,性能稳定。2.CGLIB动态代理基于字节码增强实现,无需接口,直接继承目标类生成子类代理对象,可以代理类中所有方法。缺点是无法代理final、private方法,SpringBoot2.x默认使用CGLIB代理。核心区别:有接口用JDK代理,无接口用CGLIB代理;JDK代理基于接口,CGLIB基于继承。4.AOP五种通知的执行顺序?环绕通知和其他通知的区别?参考答案:1.五种通知类型•@Before:前置通知,目标方法执行前执行;•@AfterReturning:后置正常返回通知,目标方法正常执行结束、无异常时执行;•@AfterThrowing:异常通知,目标方法抛出异常时执行;•@After:最终通知,无论方法正常结束还是异常终止,都会执行;•@Around:环绕通知,包裹目标方法,可手动控制方法执行。2.正常执行顺序:环绕前置->前置通知->目标方法执行->环绕后置->后置返回通知->最终通知3.异常执行顺序:环绕前置->前置通知->目标方法报错->异常通知->最终通知环绕通知区别:功能最强,可自主控制目标方法是否执行、修改入参、修改返回值、捕获异常,其他通知只能被动监听方法状态,无法干预方法执行。四、Spring事务核心面试题(重中之重)1.Spring事务的两种实现方式?各自优缺点?参考答案:1.编程式事务手动编写代码控制事务的开启、提交、回滚,通过TransactionTemplate实现。优点是事务粒度精细,可灵活控制;缺点是代码侵入性强,冗余代码多,实际项目几乎不用。2.声明式事务基于AOP实现,通过@Transactional注解开启事务,无需手动写事务代码。优点是无代码侵入、简洁优雅、统一管理;缺点是事务粒度只能控制在类或方法级别,灵活性稍差,是项目主流使用方式。2.@Transactional注解失效的常见场景?(高频面试)参考答案:声明式事务基于AOP动态代理实现,只要破坏代理机制,事务就会失效,常见8种场景:1.方法非public修饰:SpringAOP只会拦截public方法,private、protected方法事务失效;2.同类内部调用:A类的a方法(无事务)调用本类b方法(有事务),事务失效,因为是原对象调用,不是代理对象调用;3.异常类型不匹配:默认只捕获RuntimeException和Error,普通CheckedException(编译异常)不会回滚,需要手动配置rollbackFor;4.异常被手动捕获:方法内部try-catch捕获了所有异常,未向外抛出,Spring无法感知异常,不会回滚;5.数据库引擎不支持事务:MySQL使用MyISAM引擎(不支持事务),换成InnoDB即可;6.多线程场景:事务是基于线程绑定的,子线程操作无法加入主线程事务;7.传播机制配置不当:如配置了NOT_SUPPORTED、NEVER等传播属性,会导致事务不生效;8.Bean未被Spring管理:当前类没有交给Spring容器创建,代理无法生效,事务失效。3.Spring事务的7种传播机制?核心常用的4种?参考答案:事务传播机制是指当存在嵌套事务、方法嵌套调用时,子事务如何继承父事务的规则。核心常用4种(面试必背):1.REQUIRED(默认):如果当前有事务,加入当前事务;如果没有,新建事务。最常用,满足绝大多数业务场景;2.REQUIRES_NEW:无论当前是否有事务,都会新建一个独立事务,挂起原有事务,互不影响,常用于日志记录、异步记录;3.SUPPORTS:有事务就加入,无事务就非事务执行;4.NESTED:嵌套事务,有当前事务则嵌套执行,子事务可独立回滚不影响父事务;无事务则新建事务;其余3种冷门:NOT_SUPPORTED(始终非事务执行)、MANDATORY(必须有事务,否则报错)、NEVER(禁止有事务,否则报错)。4.数据库事务的四大隔离级别及解决的问题?参考答案:事务隔离级别是为了解决并发事务产生的脏读、不可重复读、幻读问题,Spring兼容数据库原生隔离级别,共4级:1.READ_UNCOMMITTED(读未提交):最低级别,可读取未提交数据,存在脏读、不可重复读、幻读,几乎不用;2.READ_COMMITTED(读已提交):Oracle默认级别,只能读取已提交数据,解决脏读,存在不可重复读、幻读;3.REPEATABLE_READ(可重复读):MySQL默认级别,解决脏读、不可重复读,存在幻读;4.SERIALIZABLE(串行化):最高级别,完全串行执行,解决所有并发问题,但性能极低,极少使用。核心问题解释:脏读(读取未提交脏数据)、不可重复读(同一事务多次查询结果不一致)、幻读(同一事务多次查询数据条数不一致)。五、Spring注解与配置面试题1.@Component、@Service、@Controller、@Repository的区别?参考答案:四个注解功能一致,都是将类交给Spring容器管理,生成Bean对象,底层都是基于@Component实现,只是语义不同,用于区分不同业务层:1.@Component:通用组件注解,不属于三层架构的通用类使用;2.@Service:用于业务逻辑层(Service层);3.@Repository:用于数据持久层(Dao/Mapper层);4.@Controller:用于Web控制层,接收请求、响应数据。实操说明:互相替换代码不会报错,但不符合代码规范,项目中必须按层级使用对应注解。2.@Autowired和@Resource的区别?参考答案:两者都是用于依赖注入,核心区别如下:1.来源不同:@Autowired是Spring提供的注解;@Resource是JDK原生规范注解;2.注入规则不同:@Autowired默认按类型(byType)注入;@Resource默认按名称(byName)注入,名称找不到再按类型;3.必填性不同:@Autowired默认必须找到对应Bean,否则报错,可通过required=false设置非必填;@Resource默认非必填;4.适用场景:项目主流使用@Autowired,配合@Qualifier指定名称解决多Bean冲突。3.Spring的自动配置原理是什么
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026及未来5年中国TPR窗贴市场现状数据分析及前景预测报告
- 2026及未来5年中国N-甲基苄基苯胺市场现状数据分析及前景预测报告
- 2026年易地扶贫搬迁后续扶持考核题库附答案
- 2026年资产评估师《资产评估基础》真题及答案解析
- 带状疱疹讲课
- 2026年国家开放大学电大中级财务会计期末模拟试题及答案详解
- 2026年电工基常识模拟试题(含答案)
- 2026年爱婴医院护士模拟试题(含答案)
- 2026年材料力学绘图模拟试题(含答案)
- 2026年安徽历史考编模拟试题(含答案)
- 乙酸乙酯危险化学品安全周知卡培训课件
- 2026年部队预防犯罪安全形势分析
- GB/T 47574.1-2026离心铸钢及合金铸件第1部分:通用试验与公差
- 2026年4月自考02160流体力学试题及答案含评分参考
- 自身免疫性溶血性贫血诊疗规范
- GB/T 47067-2026塑料模塑件公差和验收条件
- 2025年04月安徽国控资本有限公司所属子企业招考1名财务部负责人笔试历年典型考点题库附带答案详解试卷2套
- 2025年矿业权评估师(矿业权评估经济与法律专业能力)试题(含答案)
- 中学物理全套教材目录及说明
- 2025年交通事故统计
- 2025 SMETA员工公平职业发展管理程序-SEDEX验厂专用文件(可编辑)
评论
0/150
提交评论