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

下载本文档

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

文档简介

Spring框架面试题及详细答案(真实面试版)一、Spring基础核心面试题1.简单说说你对Spring框架的理解,Spring的核心作用是什么?Spring是一款轻量级的Java开发框架,核心目的是解耦,简化企业级Java开发,规避传统JavaEE开发中代码冗余、耦合度高、难以维护的问题。它的核心功能可以概括为两点:IOC(控制反转)和AOP(面向切面编程)。除此之外,Spring还提供了事务管理、依赖注入、资源整合、框架整合等全套能力,能够无缝对接MyBatis、Redis、MQ等常用中间件,也是SpringBoot、SpringCloud的底层基础。日常开发中,Spring最大的价值就是帮我们管理所有业务Bean,统一对象的创建、生命周期和依赖关系,让开发者专注业务逻辑,不用关注对象初始化、资源释放等底层繁琐操作。2.什么是IOC(控制反转)?原理是什么?IOC全称控制反转,是Spring最核心的设计思想。简单来说,把对象的创建、依赖管理、生命周期的控制权,从开发者代码中交给Spring容器管理,这就是控制反转。传统开发中,我们需要自己new对象、手动赋值依赖,对象控制权在程序员手里;而IOC模式下,我们只需要声明依赖,Spring容器自动扫描、创建对象、注入依赖,控制权发生了反转。IOC的底层原理主要依靠:XML配置/注解扫描+工厂模式+反射机制。程序启动时,Spring会加载配置信息,扫描项目中的Bean注解,通过反射机制实例化对象,存入IOC容器的Map缓存中,后续使用时直接从容器获取,无需重复创建。3.什么是DI(依赖注入)?DI和IOC的区别是什么?DI是依赖注入,是IOC的具体实现方式。指Spring容器自动将一个Bean所需要的依赖对象,主动注入到当前Bean中,无需开发者手动赋值。二者区别:IOC是一种设计思想、一种控制权反转的理念;DI是实现IOC的具体手段。通俗讲,IOC是目标,DI是落地方式。日常开发中用到的@Autowired、@Resource都是依赖注入的实现方式。4.Spring有几种依赖注入方式?各自优缺点?Spring主要有三种注入方式:1.构造器注入(官方推荐)通过类的构造方法注入依赖。优点是:保证对象初始化时依赖完全,避免空指针;保证Bean不可变,线程安全;方便单元测试。缺点是依赖过多时构造方法会臃肿。2.Setter方法注入通过set方法注入依赖。优点是适合可选依赖、动态修改依赖;缺点是对象创建后可能存在依赖缺失,容易出现空指针,线程安全性较差。3.字段注入(@Autowired直接注解字段)开发中最常用,写法简洁、代码量少。缺点是违背单一职责原则,容易导致类依赖泛滥;隐藏了依赖关系,不利于代码阅读和单元测试,Spring官方不推荐长期使用。5.@Autowired和@Resource的区别?这是面试高频对比题,核心区别集中在来源、匹配规则、默认规则:1.来源不同:@Autowired是Spring自带注解;@Resource是JDK原生注解(Java规范)。2.匹配规则不同:@Autowired默认按类型byType匹配;@Resource默认按名称byName匹配,找不到名称再按类型匹配。3.必填属性:@Autowired默认要求依赖必须存在,否则报错,可通过required=false取消强制校验;@Resource没有必填限制。4.适用场景:Spring项目中优先用@Autowired,配合@Qualifier可以精准指定Bean名称,解决多实现类冲突问题。二、SpringBean核心面试题1.说说SpringBean的生命周期?SpringBean完整生命周期分为8个核心步骤,贴合源码执行流程,真实面试回答这个版本最稳妥:1.实例化:Spring容器启动,通过反射创建Bean的空实例对象;2.属性填充:完成依赖注入,给Bean的属性赋值;3.前置处理(Bean后置处理器前置):执行BeanPostProcessor的前置处理方法,对Bean做预处理;4.初始化前置方法:执行InitializingBean的beforePropertiesSet方法,或自定义init-method;5.初始化方法:执行afterPropertiesSet和自定义初始化方法;6.后置处理(Bean后置处理器后置):执行BeanPostProcessor后置方法,AOP代理就是在这一步完成;7.就绪使用:Bean初始化完成,存入IOC容器,供业务调用;8.销毁:容器关闭时,执行DisposableBean的销毁方法或自定义destroy-method。2.SpringBean的作用域有哪些?默认是什么?Spring共6种作用域,开发中常用的只有2种:1.singleton(单例):默认作用域,整个Spring容器中只创建一个Bean实例,全局共享,容器启动时初始化。2.prototype(多例):每次从容器获取Bean都会创建一个新实例,容器启动时不初始化,调用时才创建。3.request:一次HTTP请求一个实例;4.session:一个浏览器会话一个实例;5.application:整个Web应用一个实例;6.websocket:WebSocket会话级作用域。高频坑点:单例Bean是非线程安全的,所以开发中绝对不要在Bean中定义成员变量,会出现并发数据错乱问题。3.单例Bean为什么是线程不安全的?怎么解决?Spring的单例Bean是容器级单例,而非线程级单例。整个容器只有一个Bean对象,所有请求线程共享这一个对象。如果Bean中存在可变的成员变量,多线程并发访问时会出现变量覆盖、数据错乱,所以线程不安全。解决方案:1.尽量不在单例Bean中定义成员变量,只用局部变量;2.需要可变变量时,使用ThreadLocal存储线程私有数据;3.将Bean作用域改为prototype多例(不推荐,会创建大量对象,浪费资源);4.加锁控制并发(适用于简单场景,高并发下性能差)。4.SpringBean的懒加载是什么?什么时候用?普通单例Bean会在容器启动时立即初始化,而懒加载Bean(@Lazy)会在第一次被调用时才初始化。适用场景:1.大型项目中部分Bean初始化耗时久,拖慢项目启动速度;2.部分组件非核心业务,无需启动加载;3.解决循环依赖的部分场景。注意:懒加载Bean只有单例模式生效,多例模式本身就是调用时创建,无需懒加载。三、SpringAOP核心面试题1.什么是AOP?核心思想和应用场景?AOP是面向切面编程,是对OOP面向对象编程的补充。核心思想是在不修改原有业务代码的前提下,对方法进行增强,实现代码解耦。它可以把项目中通用的、重复的逻辑抽离成切面,比如日志、权限、事务、限流、监控,统一处理,避免每个业务方法重复写代码。日常开发常用场景:统一日志记录、事务控制、接口权限校验、方法耗时统计、异常统一处理、参数校验。2.AOP的核心术语有哪些?1.切面(Aspect):封装通用逻辑的类,也就是我们写的切面类;2.连接点(JoinPoint):可以被切面拦截的所有方法;3.切入点(PointCut):我们真正要拦截的、匹配规则的方法;4.通知(Advice):切面具体执行的增强逻辑,分为前置、后置、异常、最终、环绕通知;5.目标对象:被代理的原始业务类;6.织入:将切面增强逻辑嵌入目标方法的过程。3.AOP有几种通知?执行顺序是什么?共5种通知类型:1.@Before:前置通知,目标方法执行前执行;2.@AfterReturning:后置正常通知,目标方法正常执行完毕、无异常时执行;3.@AfterThrowing:异常通知,目标方法抛出异常时执行;4.@After:最终通知,无论方法正常结束还是异常结束,都会执行;5.@Around:环绕通知,包裹目标方法,可控制方法执行、修改参数、拦截返回值。正常执行顺序:环绕前置→前置通知→目标方法执行→后置正常通知→最终通知→环绕后置异常执行顺序:环绕前置→前置通知→目标方法报错→异常通知→最终通知4.SpringAOP的动态代理机制?JDK代理和CGLIB代理区别?SpringAOP底层依靠动态代理实现,分为两种方式:1.JDK动态代理基于接口实现,只能代理实现了接口的类。优点是JDK原生支持,无需引入额外依赖;缺点是无接口的类无法代理。2.CGLIB动态代理基于子类继承实现,无需接口,直接对目标类生成子类代理。可以代理普通类、无接口类。SpringBoot2.0之后默认使用CGLIB代理。核心区别总结:JDK代理:必须有接口,基于接口代理,性能略高;CGLIB代理:无需接口,基于子类继承,可代理所有类,是Spring默认代理方式。5.AOP为什么会失效?常见失效场景?面试高频问题,开发中经常遇到,核心原因是AOP基于代理对象生效,只有通过容器代理对象调用方法才会触发切面,原生对象调用不会生效。常见失效场景:1.类内部方法自调用:同一个类中,A方法调用本类的B切面方法,B方法切面失效,因为是this原生对象调用,不是代理对象;2.方法被private、static、final修饰,无法被代理拦截;3.切面切入点表达式书写错误,没有匹配到目标方法;4.多切面场景下优先级设置错误,切面被覆盖;5.未开启AOP注解(缺少@EnableAspectJAutoProxy)。解决方案:内部调用时,通过Spring上下文获取当前类的代理对象调用方法,即可解决失效问题。四、Spring事务核心面试题(重点)1.Spring事务的实现原理?Spring事务底层基于AOP动态代理实现。通过@Transactional注解标识需要事务的方法,启动时生成代理对象,在方法执行前开启事务,执行中捕获异常,成功则提交,异常则回滚。核心流程:代理拦截→开启事务→执行目标业务方法→无异常提交事务→有异常回滚事务→释放资源。2.Spring事务的传播机制有哪些?常用的几种?Spring共有7种事务传播机制,开发中只用4种核心的:1.REQUIRED(默认):如果当前有事务,加入当前事务;没有则新建事务。最常用,适用于绝大多数业务场景。2.SUPPORTS:有事务就加入,无事务就非事务执行。适合查询接口。3.REQUIRES_NEW:无论当前是否有事务,都新建一个独立事务,旧事务挂起。适用于独立日志记录、异步记录场景。4.NESTED:嵌套事务,有当前事务则嵌套执行,可单独回滚子事务;无则新建事务。其余三种:MANDATORY、NOT_SUPPORTED、NEVER,业务开发几乎不用。3.Spring事务的隔离级别?解决什么问题?数据库并发会出现脏读、不可重复读、幻读三大问题,Spring基于数据库提供4种隔离级别:1.READ_UNCOMMITTED:读未提交,所有问题都存在,基本不用;2.READ_COMMITTED(MySQL默认):读已提交,解决脏读,存在不可重复读、幻读;3.REPEATABLE_READ:可重复读,解决脏读、不可重复读,存在幻读;4.SERIALIZABLE:串行化,解决所有并发问题,性能极低,极少使用。4.@Transactional事务失效的常见场景?(高频必问)这是面试和工作中最常用的知识点,核心失效场景如下:1.方法非public修饰:Spring事务只对public方法生效,private、protected方法直接失效;2.类内部自调用:本类无事务方法调用本类有事务方法,事务失效(AOP代理失效);3.异常类型不对:默认只回滚RuntimeException运行时异常,普通Exception、IOException不会回滚;4.异常被手动捕获:方法内try-catch捕获异常,未向外抛出,Spring无法感知异常,不会回滚;5.数据库引擎不支持事务:MyISAM引擎无事务能力,必须用InnoDB;6.传播机制配置错误:配置为NOT_SUPPORTED、NEVER等无事务机制。5.事务中try-catch捕获异常,怎么保证事务回滚?两种解决方案:1.捕获异常后,手动抛出运行时异常,让Spring捕获触发回滚;2.手动获取事务管理器,调用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()手动强制回滚。五、Spring循环依赖面试题1.什么是循环依赖?Spring怎么解决循环依赖?循环依赖就是两个或多个Bean互相依赖,比如A依赖B,B又依赖A,容器初始化时会出现循环嵌套问题。Spring只能解决单例Bean、Setter/字段注入的循环依赖,无法解决构造器注入、多例Bean的循环依赖。核心解决方案:三级缓存1.一级缓存(singletonObjects):存放完全初始化完成的Bean;2.二级缓存(earlySingletonObjects):存放实例化完成、未赋值依赖的半成品Bean;3.三级缓存(singletonFactories):存放Bean的工厂对象,提前暴露Bean引用。流程:A实例化后存入三级缓存→注入B→B实例化后从三级缓存获取半成品A→B初始化完成→A完成属性填充和初始化→升入一级缓存。2.为什么构造器注入的循环依赖无法解决?构造器注入的执行顺序是:必须先完成依赖注入,才能实例化对象。A的构造方法需要B,B的构造方法需要A,两个对象都无法完成实例化,没有半成品对象可以存入三级缓存,直接出现死循环报错,所以Spring无法解决。六、Spring核心杂项高频面试题1.Spring的注解有

温馨提示

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

评论

0/150

提交评论