版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Spring框架高频面试题(真实职场版)一、Spring基础核心面试题1.简单说说你对Spring框架的理解,Spring的核心作用是什么?Spring是一款轻量级的Java开发开源框架,核心是简化企业级Java开发,解决传统JavaEE开发臃肿、耦合度高、代码冗余的问题。它不局限于某一层开发,能够贯穿JavaWeb的持久层、业务层、控制层,整合各类开源组件。核心两大思想:IoC控制反转、AOP面向切面编程。核心作用:解耦对象依赖、统一管理组件、简化事务、日志、权限等通用功能开发,降低项目维护成本,适配分层架构开发。2.什么是IoC?控制反转具体反转了什么?IoC即控制反转,是Spring的核心设计思想。传统开发中,对象的创建、依赖对象的赋值,都是由开发者手动在代码中new、赋值,主动权在开发者手中。而IoC将对象的创建、管理、依赖注入的控制权,从业务代码反转交给Spring容器,开发者只需要声明依赖,无需手动创建对象。简单来说:反转的是对象控制权和依赖管理权限,实现了业务代码和对象创建的彻底解耦。3.依赖注入(DI)的三种方式,各自优缺点?项目中常用哪种?依赖注入是IoC的具体实现方式,主要有三种:1.构造器注入:通过类的构造方法注入依赖优点:保证对象初始化时依赖完全、线程安全、避免空指针、符合单一职责;Spring官方推荐,也是项目主流用法。缺点:依赖过多时构造方法会臃肿。2.Setter方法注入:通过set方法注入依赖优点:适合可选依赖、动态修改依赖场景。缺点:对象创建后可能存在依赖缺失,线程安全性差。3.字段注入(@Autowired直接注解字段)优点:代码极简、开发快捷。缺点:隐藏依赖关系、容易导致循环依赖、不利于单元测试,大型项目不推荐。项目实战首选:构造器注入,Spring4.3之后默认支持单构造器自动注入,无需额外加注解。4.SpringBean的生命周期详细流程?完整生命周期分为7个核心步骤,面试高频必背:1.实例化:Spring容器扫描Bean定义,通过反射创建Bean实例(仅开辟内存,无属性赋值);2.属性填充:完成依赖注入,给Bean的属性赋值;3.前置处理:执行Bean后置处理器的前置方法(BeanPostProcessor);4.初始化:先执行InitializingBean的afterPropertiesSet方法,再执行自定义init-method初始化方法;5.后置处理:执行Bean后置处理器的后置方法,可对Bean做代理、增强;6.就绪使用:Bean完成初始化,存入单例池,供业务调用;7.销毁:容器关闭时,执行DisposableBean的destroy方法、自定义destroy-method销毁方法。5.SpringBean的作用域有哪些?默认作用域是什么?Spring核心6种作用域,常用2种:1.singleton(单例):默认作用域,整个Spring容器中仅创建一个Bean实例,全局共享,容器启动时初始化;2.prototype(多例):每次获取Bean都会创建新实例,容器不管理多例Bean的销毁;3.request:一次HTTP请求创建一个实例;4.session:一个用户会话创建一个实例;5.application:整个Web应用全局一个实例;6.websocket:一个WebSocket连接一个实例。注意:单例Bean是线程不安全的,开发中禁止在Bean中定义成员变量,避免并发问题。二、SpringAOP核心面试题1.什么是AOP?核心应用场景有哪些?AOP即面向切面编程,是基于动态代理的编程思想,核心是在不修改原有业务代码的前提下,对方法进行增强。可以将项目中通用的、与业务无关的逻辑抽离出来,统一管理。常见应用场景:统一日志记录、事务控制、权限校验、接口限流、性能监控、参数校验、异常统一处理。2.AOP的核心术语你怎么理解?(切面、切入点、通知、连接点)1.连接点(JoinPoint):所有可以被拦截的方法,是候选拦截点;2.切入点(Pointcut):从所有连接点中筛选出的、真正需要拦截的方法;3.通知(Advice):拦截方法后执行的增强逻辑,分为前置、后置、异常、最终、环绕通知;4.切面(Aspect):切入点+通知的结合体,是完整的增强类;5.目标对象:被AOP增强的原始业务对象。3.SpringAOP的两种动态代理方式?区别是什么?如何选择?SpringAOP底层基于两种动态代理实现:1.JDK动态代理:只能代理实现了接口的类,基于接口生成代理对象,无依赖;2.CGLIB动态代理:基于子类继承实现代理,无需接口,可以代理普通类,通过字节码增强实现。选择规则:Spring默认优先使用JDK代理;当类没有实现任何接口时,自动使用CGLIB代理;SpringBoot2.0之后默认开启CGLIB代理。4.AOP环绕通知和其他通知的区别?实际项目怎么用?前置、后置、异常、最终通知,都是单一阶段的增强,无法控制目标方法的执行。环绕通知(@Around)是功能最强的通知,可以手动控制目标方法是否执行、修改入参、修改返回值、捕获异常、控制执行耗时。项目中接口耗时监控、参数加密解密、全局接口拦截、限流熔断,基本都用环绕通知实现。三、Spring事务核心面试题(高频重点)1.Spring事务的实现原理?Spring事务基于AOP动态代理实现,核心流程:1.程序调用带有@Transactional注解的方法;2.Spring通过AOP拦截该方法,生成代理对象;3.方法执行前,开启数据库事务;4.执行目标业务方法;5.方法正常执行完毕,提交事务;6.方法抛出异常,回滚事务。本质是通过代理增强,对数据库操作进行统一的事务管控,无需手动写commit、rollback。2.Spring事务的传播机制有哪些?常用的几种区别?Spring一共7种事务传播机制,项目最常用5种:1.REQUIRED(默认):当前有事务就加入,没有就新建事务;最常用,适配绝大多数业务;2.SUPPORTS:当前有事务就加入,没有就非事务执行;3.MANDATORY:必须在事务内执行,无事务直接报错;4.REQUIRES_NEW:无论当前是否有事务,都新建一个独立事务,原事务挂起;适用于日志记录、独立存档业务;5.NESTED:嵌套事务,依赖父事务,父事务回滚子事务必回滚,子事务可单独回滚;6.NOT_SUPPORTED:始终非事务执行;7.NEVER:强制无事务,有事务则报错。3.Spring事务失效的场景有哪些?(面试高频痛点)实际开发中最常见的6种事务失效场景,也是线上bug高发点:1.方法非public修饰:SpringAOP只能拦截public方法,非public无法生成代理,事务失效;2.同类方法内部调用:A方法(无事务)调用本类带@Transactional的B方法,不走代理,事务失效;解决方案:自身注入、通过代理类调用;3.异常类型不匹配:默认只回滚RuntimeException和Error,自定义检查异常不回滚,需要手动指定rollbackFor;4.异常被手动捕获:方法内try-catch捕获所有异常,未抛出,Spring无法感知异常,不会回滚;5.数据库引擎不支持事务:MySQLMyISAM引擎不支持事务,必须用InnoDB;6.传播机制配置错误:如配置为SUPPORTS、NOT_SUPPORTED等非事务传播属性。4.事务的隔离级别?各自解决什么问题?Spring对应数据库4种隔离级别,解决脏读、不可重复读、幻读问题:1.READ_UNCOMMITTED(读未提交):最低级别,存在脏读、不可重复读、幻读;2.READ_COMMITTED(读已提交):解决脏读,存在不可重复读、幻读;Oracle默认级别;3.REPEATABLE_READ(可重复读):解决脏读、不可重复读,存在幻读;MySQLInnoDB默认级别;4.SERIALIZABLE(串行化):最高级别,解决所有并发问题,性能极差,基本不用。脏读:读取到其他事务未提交的脏数据;不可重复读:同一事务内,多次读取同一数据,结果不一致;幻读:同一事务内,其他事务新增/删除数据,导致查询总数变化。四、Spring核心进阶面试题1.Spring循环依赖是什么?Spring怎么解决循环依赖?循环依赖:两个或多个Bean互相依赖对方,比如A依赖B、B依赖A,导致容器无法完成Bean初始化。Spring仅能解决单例模式下、Setter/字段注入的循环依赖,无法解决构造器注入循环依赖。核心解决方案:三级缓存1.一级缓存:存放完全初始化好的完整Bean;2.二级缓存:存放原始Bean对象(已实例化、未填充属性);3.三级缓存:存放Bean的工厂对象,用于提前暴露Bean实例;原理:Bean实例化后,提前将半成品Bean放入三级缓存,后续依赖对象可直接获取,打破循环阻塞。2.@Component、@Service、@Repository、@Controller区别?核心功能一致,都是将类交给Spring管理,注册为Bean,只是语义不同,适配不同分层:1.@Component:通用组件注解,适用于所有非业务通用类;2.@Service:业务层专用注解,标注业务逻辑类;3.@Repository:持久层专用注解,标注DAO层,可捕获数据库异常;4.@Controller:控制层专用注解,接收前端请求,SpringMVC专属。本质:后三个注解都是@Component的衍生注解,仅仅是分层语义区分。3.@Autowired和@Resource的区别?1.来源不同:@Autowired是Spring自带注解;@Resource是JSR250Java原生注解;2.注入规则不同:@Autowired默认按类型注入;@Resource默认按名称注入,名称找不到再按类型;3.必填性不同:@Autowired默认要求依赖必须存在,可通过required=false取消;@Resource允许依赖为空;4.使用场景:项目主流统一使用@Autowired,配合@Qualifier指定名称解决多Bean冲突。4.Spring的Bean工厂和ApplicationContext的区别?1.BeanFactory:Spring最底层的Bean工厂,是顶级接口,采用延迟加载,只有获取Bean时才会创建,占用资源少,功能简单,仅支持Bean创建和获取;2.ApplicationContext:BeanFactory的子接口,是完整的Spring容器,默认立即加载所有单例Bean,扩展了大量功能:国际化、事件发布、资源加载、AOP整合、事务支持等,项目中实际使用的都是ApplicationContext。五、实战场景面试题(面试官最爱问)1.项目中为什么要用构造器注入?字段注入有什么坑?字段注入最大的问题是隐性依赖,代码看不出类的依赖关系,长期迭代会导致类臃肿、职责混乱,极易产生循环依赖,且无法做单元测试(无法手动传入依赖)。构造器注入可以明确展示所有依赖,保证对象初始化完整性,线程安全,有效避免循环依赖,符合Spring官方开发规范,适配高并发业务场景。2.线上事务回滚失败,你是如何排查问题的?我会按照事务失效的常见场景逐一排查:首先检查方法是否为public、是否存在同类内部调用;再查看异常
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026及未来5年中国三彩挂盘市场现状数据分析及前景预测报告
- 2026及未来5年中国TPU鞋头市场现状数据分析及前景预测报告
- 2026及未来5年中国MP-3润滑脂市场现状数据分析及前景预测报告
- 2026年江苏常州事业单位招聘笔试试题及答案
- 2026年生态环境行政执法模拟试卷及答案解析
- 2026年散酒人群模拟题及答案详解
- 2026年电力测量学模拟试卷(含答案)
- 财务管理基础2026年企业会计实务考试及答案详解
- 2026年初级化妆理论模拟试题(含答案)
- 2026年中心招聘应届毕业生3人模拟试卷(含答案)
- 2026-2030中国羧甲基纤维素市场供需调查及竞争格局研究报告
- 7.1 集体生活成就我课件(共27张)+内嵌视频
- 铁路集团综合管理岗社会招聘笔试参考题库 含答案
- 2026年河北工人技师考评(环境噪声监测工)自测试题及答案
- 宠物毛发护理技巧
- DB32-T 5388-2026 电动车充电基础设施建设技术规程 第2部分:电动汽车
- 2026年人工智能赋能机械设计的新路径
- 寺庙消防安全培训
- 福建金投集团招聘笔试题目
- 医用防护用品试题及答案
- 家具质量管理与控制
评论
0/150
提交评论