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

下载本文档

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

文档简介

Spring框架高频面试题及详细答案(知乎实战版)整理了一线互联网面试最常问的Spring核心考点,全部结合实际开发场景作答,摒弃书本化套话,适合面试突击、复盘巩固,覆盖Spring核心原理、IOC、AOP、事务、循环依赖、Bean生命周期等高频重难点。一、Spring核心基础面试题1、简单说说你对Spring框架的理解,Spring的核心是什么?Spring是一款轻量级的Java开源分层框架,主要用于解决企业级开发中代码耦合度高、冗余繁琐的问题,几乎是Java后端开发的基础框架。它不依赖特定的开发规范,兼容性极强,可以整合MyBatis、Redis、MQ等各类主流中间件。Spring的核心就两个:IOC(控制反转)和AOP(面向切面编程)。IOC的核心是把对象的创建、管理、销毁权限从开发者代码中交给Spring容器,彻底解耦;AOP则是在不修改原有业务代码的前提下,实现功能的增强,比如日志记录、事务控制、权限校验等,符合开闭原则。除此之外,Spring也提供了便捷的事务管理、Web开发、数据访问等全套能力。2、SpringIOC控制反转是什么?和传统开发方式有什么区别?控制反转顾名思义,就是反转了对象的控制权。传统开发中,我们需要使用对象时,会自己new对象、管理对象依赖,控制权在开发者手里;而IOC模式下,所有Java对象(Bean)的创建、初始化、依赖注入、销毁都由SpringIOC容器统一管理,开发者直接使用即可,不用手动维护对象。很多人容易把IOC和DI混淆,其实DI依赖注入是实现IOC的手段,IOC是思想,DI是落地方式。容器会自动将对象需要的依赖资源注入进去,不用我们手动赋值。核心优势:大幅降低代码耦合度,对象之间依赖松散,便于单元测试、代码迭代和维护。3、SpringIOC容器的底层实现原理是什么?SpringIOC容器的核心底层逻辑可以分为三步,也是容器启动的完整流程:第一,资源加载与解析。容器启动后,会读取XML配置文件、Java配置类或者注解标识的Bean信息,扫描项目中的所有组件,解析出Bean的类路径、属性、依赖关系等元数据。第二,Bean定义注册。将解析好的Bean信息封装成BeanDefinition对象,注册到BeanDefinition注册表中,此时只是保存了Bean的定义信息,还没有创建实例。第三,Bean实例化与初始化。容器启动完成前,会对单例非懒加载的Bean进行统一实例化,通过反射创建对象,再完成依赖注入、初始化方法执行,最终将完整的Bean放入单例池(一级缓存),供全局使用。4、SpringBean的作用域有哪些?日常开发最常用的是哪个?Spring一共提供6种Bean作用域,其中前两种是核心常用的:1、singleton(单例,默认):整个Spring容器中只会创建一个Bean实例,全局共享。容器启动时初始化(非懒加载),容器销毁时销毁。日常开发中90%的场景都是用单例,Controller、Service、Mapper默认都是单例。2、prototype(多例):每次从容器中获取Bean时,都会创建一个全新的实例,容器不会管理多例Bean的生命周期,只会负责创建,不会销毁。其余四种为Web环境专属:request、session、application、websocket,普通后端开发几乎用不到。面试高频延伸:单例Bean是线程安全的吗?不安全。单例Bean全局共享,如果Bean中存在成员变量,多线程并发修改会出现线程安全问题,所以开发中严禁在Service、Controller中定义可变的成员变量。5、说说SpringBean的完整生命周期?(高频必问)这是面试核心考点,完整流程可以分为实例化、填充属性、初始化、销毁四大阶段,详细步骤:1、实例化:Spring通过反射根据BeanDefinition创建Bean的空实例,此时对象已经存在,但属性都是默认值,还没有赋值。2、属性填充(依赖注入):Spring自动解析当前Bean的所有依赖,完成@Autowired、构造器、set方法注入,给对象属性赋值。3、前置处理:执行BeanPostProcessor的前置初始化方法,对Bean进行前置增强处理。4、初始化:先执行InitializingBean的afterPropertiesSet方法,再执行自定义的init-method初始化方法。5、后置处理:执行BeanPostProcessor的后置初始化方法,AOP代理就是在这一步完成的。6、就绪使用:Bean初始化完成,放入单例池,供业务代码调用。7、销毁:容器关闭时,执行DisposableBean的destroy方法和自定义的destroy-method方法,完成资源释放。二、Spring循环依赖高频面试题1、什么是Spring循环依赖?Spring能解决哪些循环依赖?循环依赖就是两个或多个Bean互相依赖,比如A中注入B,B中又注入A,形成闭环依赖。Spring对循环依赖的支持是有限制的:✅可以解决:单例模式下的set方法注入、字段注入(@Autowired)的循环依赖。❌无法解决:构造器注入的循环依赖、多例Bean的循环依赖。日常开发中我们最常用的@Autowired字段注入,出现循环依赖Spring是可以自动解决的,不会报错;但构造器注入一旦出现循环依赖,容器启动直接报错。2、Spring解决循环依赖的核心原理是什么?(三级缓存原理)Spring解决单例Bean循环依赖的核心就是三级缓存机制,三个缓存全部是Map结构,各司其职:一级缓存(singletonObjects):存放完全初始化完成、可以直接使用的单例Bean。二级缓存(earlySingletonObjects):存放已经实例化、但还未完成属性填充和初始化的半成品Bean,避免重复创建原始Bean。三级缓存(singletonFactories):存放Bean的工厂对象(Lambda表达式),核心作用是提前暴露Bean的引用,同时支持AOP代理Bean的循环依赖。完整执行流程(以A、B互相依赖为例):1、Spring创建A,先实例化出A的半成品对象,将A的工厂对象放入三级缓存;2、开始给A填充属性,发现需要依赖B,此时去创建B;3、B实例化后填充属性,发现需要依赖A,去缓存中查找A;4、从三级缓存中获取A的工厂对象,创建A的引用,赋值给B;5、B完成初始化,放入一级缓存;A拿到完整的B,完成自身初始化,最终也放入一级缓存,循环依赖解决。3、为什么构造器注入的循环依赖无法解决?因为三级缓存的核心是先实例化、后填充属性,提前暴露半成品Bean的引用。而构造器注入的逻辑是:创建对象的同时必须传入所有依赖。创建A的时候,必须通过构造器传入B,此时B还不存在;创建B的时候,必须传入A,A也没有完成创建,全程没有半成品对象可以提前暴露,三级缓存完全无法介入,所以直接启动失败。三、SpringAOP核心面试题1、什么是SpringAOP?核心作用和应用场景?AOP即面向切面编程,是一种横向增强代码的思想,核心是在不修改原有业务代码的前提下,对方法进行拦截、增强。把项目中通用的、重复的逻辑抽离成切面,统一管理,解耦核心业务和通用功能。日常开发高频场景:统一日志打印、接口耗时统计、权限校验、事务控制、限流拦截、缓存处理、异常统一处理。2、AOP的核心术语你怎么理解?切点(Pointcut):需要被拦截的方法,定义拦截范围,比如指定拦截所有Service层方法。通知(Advice):拦截方法后要执行的增强逻辑,分为五种:前置通知、后置通知、返回通知、异常通知、环绕通知。切面(Aspect):切点+通知的结合体,就是我们自己写的切面类。连接点(JoinPoint):所有可以被拦截的方法,是候选范围,切点是连接点的子集。织入(Weaving):将切面增强逻辑植入到目标方法的过程。3、SpringAOP的动态代理方式有哪些?区别是什么?SpringAOP默认根据目标类自动选择代理方式,两种方式:1、JDK动态代理:基于接口实现,目标类必须实现接口,只能代理接口中的方法,性能较高,原生JDK支持,无需依赖第三方包。2、CGLIB动态代理:基于子类继承实现,不需要接口,直接对目标类生成子类代理,可以代理类中所有方法。SpringBoot2.0之后默认使用CGLIB代理。核心区别:JDK代理必须有接口,CGLIB无需接口;JDK只能代理接口方法,CGLIB可以代理普通方法、final方法除外。4、AOP为什么无法拦截Controller的方法?(实战坑点)很多开发中会遇到切面拦截不到Controller的问题,核心原因是:SpringMVC的Bean加载顺序和AOP织入顺序问题。默认的AOP切面优先级低于SpringMVC的Bean初始化优先级,导致Controller初始化完成后,切面才完成织入,无法拦截。解决方式是手动提升切面优先级,或者指定拦截路径精准匹配。四、Spring事务高频面试题1、Spring事务的实现原理?Spring事务底层基于AOP动态代理实现,属于声明式事务。核心流程:当带有@Transactional注解的方法被调用时,Spring会通过代理对象拦截方法执行,在方法执行前开启事务,执行中如果出现异常则回滚,执行成功则提交事务,全程无需手动写事务开启、提交、回滚代码。2、Spring事务的传播属性有哪些?重点说常用的Spring一共7种事务传播属性,开发中最常用的3种:1、REQUIRED(默认):如果当前有事务,就加入当前事务;如果没有,就新建一个事务。最常用,绝大多数业务场景都用这个。2、REQUIRES_NEW:无论当前是否有事务,都会新建一个独立事务,暂停原有事务,新事务执行完再恢复旧事务。适用于需要独立提交、不受主事务影响的日志记录、流水记录场景。3、SUPPORTS:有事务就加入,没事务就以非事务方式执行。其余:NOT_SUPPORTED、MANDATORY、NEVER、NESTED,日常开发使用极少,面试了解即可。3、Spring事务失效的场景?(超级高频)这是面试必问的实战考点,常见失效场景:1、方法非public修饰:Spring事务基于AOP代理,非public方法无法被代理拦截,事务直接失效。2、内部调用导致失效:同一个类中,A方法(无事务)调用B方法(有事务),事务失效。因为是本类对象调用,不是代理对象调用,AOP无法拦截。解决方式:通过代理对象调用自身方法。3、异常类型不匹配:默认事务只回滚RuntimeException和Error,如果是普通Exception、检查型异常,不主动指定回滚规则,事务不会回滚。4、方法内部捕获异常:try-catch捕获了所有异常,没有抛出,Spring感知不到异常,不会触发回滚。5、数据库引擎不支持事务:MySQL使用MyISAM引擎,不支持事务,无论怎么配置都无效,必须用InnoDB。6、传播属性配置错误:配置为SUPPORTS、NOT_SUPPORTED等属性,导致事务不生效。4、Spring事务的隔离级别?对应数据库四大隔离级别,Spring新增一个默认级别,共5种:DEFAULT(默认):使用底层数据库的默认隔离级别,MySQL默认可重复读,项目中基本都用这个。READ_UNCOMMITTED(读未提交):可以读取未提交数据,会出现脏读、不可重复读、幻读,几乎不用。READ_COMMITTED(读已提交):只能读取已提交数据,解决脏读,存在不可重复读、幻读,Oracle默认级别。REPEATABLE_READ(可重复读):MySQL默认级别,解决脏读、不可重复读,存在幻读。SERIALIZABLE(串行化):最高级别,解决所有并发问题,性能极低,几乎不用于业务开发。五、Spring注解与实战高频题1、@Component、@Service、@Controller、@Repository的区别?底层本质完全一致,@Service、@Controller、@Repository都是@Component的衍生注解,功能都是将类交给Spring管理,注册为Bean。唯一区别是语义分层不同,用于区分项目层级,方便代码规范:@Controller:标注控制层,接收前端请求;@Service:标注业务层,处理业务逻辑;@Repository:标注数据访问层,操作数据库;@Component:通用组件,不属于以上三层的工具类、通用组件使用。2、@Autowired和@Resource的区别?1、来源不同:@Autowired是Spring自带注解;@Resource是JDK原生注解,属于Java标准。2、注入规则不同:@Autowired默认按类型注入;@Resource默认按名称注入,名称找不到再按类型。3、必填属性:@Autowired默认要求对象必须存在,否则报错,可通过required=false取消限制;@Resource允许为空。4、使用场景:项目中统一使用@Autowired,适配性更好,也是Spring推荐用法。3、@Configuration和@Component的区别?核心区别在于配置类的Bean代理机制:1、@Configuration专门用于配置类,内部添加@Bean注解创建Bean时,会被Spring动态代理,多次调用@Bean方法只会返回同一个单例Bean;2、如果用@Component标注配置类,多次调用@Bean方法会重复创建多个对象,无法保证单例。简单说:写配置类、定义Bean统一用@Configuration,普通组件用@Component。六、Spring进阶面试题1、Spring容器

温馨提示

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

评论

0/150

提交评论