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

下载本文档

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

文档简介

Spring后端高频面试题及详细答案(真实面试版)一、Spring基础核心面试题1.简单说说你对Spring框架的理解,它的核心作用是什么?Spring是一款轻量级的Java开源开发框架,核心目的是简化企业级Java开发,解决传统JavaEE开发臃肿、耦合度高、代码冗余的问题。它的核心主要包含两点:IoC控制反转和AOP面向切面编程。在此基础上,Spring还提供了事务管理、Web开发支持、数据访问、框架整合等全套能力,能够无缝衔接MyBatis、Redis、MQ等常用中间件。日常开发中,Spring最大的价值就是帮我们管理对象、解耦业务代码、统一管控事务和通用逻辑,让开发者专注核心业务实现。2.什么是IoC(控制反转)?DI(依赖注入)和IoC的区别是什么?IoC控制反转:是一种设计思想。传统开发中,对象的创建、依赖关系的管理都是开发者自己手动new、手动赋值;而IoC就是把对象的创建、销毁、依赖管理的权限交给Spring容器,由容器统一管控,控制权从开发者反转给了框架,所以叫控制反转。DI依赖注入:是IoC思想的具体实现方式。容器在创建对象时,自动将对象需要的依赖资源(比如Service、Mapper)注入到当前对象中,无需开发者手动赋值。两者区别:IoC是思想、是理论;DI是落地手段,Spring就是通过依赖注入实现了控制反转的效果。3.Spring依赖注入的三种方式,日常开发常用哪种?Spring支持三种依赖注入方式:1.构造器注入:通过类的构造方法注入依赖,Spring4.3之后推荐使用。优点:保证对象初始化完成后依赖一定齐全,不会出现空指针;保证依赖不可变,线程安全;符合单一职责原则。2.setter方法注入:通过set方法给属性赋值,适合可选依赖、动态修改依赖的场景。3.字段注入(@Autowired):直接在属性上加注解注入,写法最简单。缺点:容易导致类依赖过多、职责混乱;依赖隐藏,无法直观看到类的依赖关系;容易产生循环依赖问题。日常开发规范:优先使用构造器注入,可选依赖用setter注入,杜绝字段注入。4.讲讲SpringBean的生命周期?SpringBean的完整生命周期分为7个核心步骤,以单例Bean为例:1.实例化:Spring容器启动后,根据配置信息通过反射创建Bean的实例,此时只是空对象,属性未赋值。2.属性填充(依赖注入):容器自动扫描当前Bean的依赖,完成属性赋值、依赖注入。3.前置处理(BeanPostProcessor前置):执行后置处理器的前置方法,对刚填充属性的Bean做预处理。4.初始化:先执行Bean的InitializingBean接口方法,再执行自定义的init-method初始化方法。5.后置处理(BeanPostProcessor后置):执行后置处理器后置方法,SpringAOP代理就是在这一步完成。6.就绪使用:Bean初始化完成,放入单例池,供业务代码调用。7.销毁:容器关闭时,执行DisposableBean接口方法或自定义destroy-method方法,完成资源释放。5.SpringBean的作用域有哪些?默认是什么?Spring提供6种Bean作用域,开发中常用2种:1.singleton(单例):默认作用域,整个Spring容器中只创建一个Bean实例,全局共享。注意:单例Bean不是线程安全的,不能在Bean中定义可变成员变量。2.prototype(多例):每次从容器获取Bean时,都会创建一个新实例。3.request:每次HTTP请求创建一个新Bean,Web场景专用。4.session:每个用户会话对应一个Bean。5.application:整个Web应用对应一个Bean。6.websocket:每个WebSocket连接对应一个Bean。6.Spring单例Bean是线程安全的吗?为什么?怎么解决?不是线程安全的。原因:Spring单例Bean全局只有一个实例,所有请求线程共享这一个对象。如果Bean中存在可变的成员变量,多线程并发修改时会出现数据覆盖、脏数据问题。解决方式:1.尽量不在Bean中定义可变成员变量,业务数据通过方法参数传递;2.可变变量使用ThreadLocal存储,实现线程隔离;3.将Bean作用域改为多例(prototype),但不推荐滥用,会增加资源开销;4.必要时加同步锁,控制并发修改。7.什么是循环依赖?Spring怎么解决循环依赖问题?循环依赖:两个或多个Bean互相依赖,比如A依赖B,B又依赖A,容器创建Bean时互相等待,导致无法完成初始化。Spring只能解决单例模式下、setter/字段注入的循环依赖,无法解决构造器注入的循环依赖。核心解决方案:三级缓存1.一级缓存(singletonObjects):存放完全初始化完成的单例Bean,可直接使用;2.二级缓存(earlySingletonObjects):存放已实例化、但未完成属性填充和初始化的Bean半成品;3.三级缓存(singletonFactories):存放Bean的工厂对象,用于提前暴露Bean引用。执行流程:A实例化后,先将自己的工厂对象放入三级缓存,再去注入B;B创建时依赖A,从三级缓存获取A的引用完成注入,B初始化完成后放入一级缓存;A后续完成属性填充和初始化,再放入一级缓存,解决循环依赖。二、SpringAOP核心面试题1.什么是AOP?核心应用场景有哪些?AOP即面向切面编程,是对OOP面向对象编程的补充。核心思想是将通用的、与业务无关的公共逻辑抽离出来,统一管理,在不修改原有业务代码的前提下,对方法进行增强。简单说:把重复代码抽成切面,在指定方法执行前后、异常时自动执行。常见应用场景:1.统一日志记录(接口入参、出参、异常日志);2.统一权限校验、接口拦截;3.事务管理(Spring事务底层基于AOP);4.接口限流、防重复提交;5.方法耗时统计、监控埋点。2.AOP的核心术语你怎么理解?(切点、通知、切面、连接点)1.连接点(JoinPoint):可以被切面拦截的所有方法,是所有可增强的点位;2.切点(PointCut):从所有连接点中,筛选出来的需要真正增强的方法,通过表达式匹配;3.通知(Advice):切面要执行的增强逻辑,分为前置、后置、异常、最终、环绕通知;4.切面(Aspect):切点+通知的结合体,就是我们自定义的切面类;5.织入(Weaving):将切面逻辑嵌入目标方法的过程。3.SpringAOP有几种通知类型?执行顺序是什么?共5种通知类型:1.@Before前置通知:目标方法执行前执行;2.@AfterReturning后置返回通知:目标方法正常执行完毕、无异常时执行;3.@AfterThrowing异常通知:目标方法抛出异常时执行;4.@After最终通知:无论方法正常结束还是异常结束,都会执行;5.@Around环绕通知:包裹目标方法,可手动控制方法执行,功能最强。正常执行顺序:环绕前置→前置通知→目标方法执行→环绕后置→后置返回通知→最终通知异常执行顺序:环绕前置→前置通知→目标方法报错→异常通知→最终通知4.SpringAOP的动态代理机制?JDK代理和CGLIB代理的区别?SpringAOP底层依靠动态代理实现方法增强,有两种代理方式:JDK动态代理:基于接口实现,只能代理实现了接口的类。原理是通过反射生成目标接口的实现类,重写接口方法完成增强。CGLIB动态代理:基于子类继承实现,无需接口,通过生成目标类的子类,重写父类方法完成增强。核心区别:1.JDK代理必须有接口,CGLIB无需接口;2.JDK代理只能增强接口定义的方法,CGLIB可以增强类中所有方法;3.CGLIB无法代理final类和final方法(无法继承、重写);4.Spring5默认使用CGLIB代理,Spring3之前默认JDK代理。三、Spring事务核心面试题(高频重点)1.Spring事务的实现原理是什么?Spring事务底层是AOP动态代理+数据库事务实现的。当我们在方法上加@Transactional注解时,Spring会通过AOP生成当前类的代理对象,在方法执行前开启事务,方法正常执行完毕后提交事务,方法抛出异常时回滚事务,全程无需手动写commit、rollback代码。2.Spring事务的传播属性有哪些?日常常用的是哪几个?Spring一共有7种事务传播属性,核心常用3种:1.REQUIRED(默认):当前有事务就加入,没有就新建事务。最常用,适配绝大多数业务场景。2.REQUIRES_NEW:无论当前是否有事务,都会新建一个独立事务,旧事务会被挂起,新事务执行完毕再恢复旧事务。适用于日志记录、异步兜底等需要独立事务的场景。3.SUPPORTS:有事务就加入,没有就非事务执行。4.NOT_SUPPORTED:始终非事务执行,存在事务则挂起。5.MANDATORY:必须在事务内执行,无事务则报错。6.NEVER:必须非事务执行,存在事务则报错。7.NESTED:嵌套事务,依赖父事务,父事务回滚则子事务全部回滚,子事务回滚不影响父事务。3.Spring事务的隔离级别?解决什么问题?Spring基于数据库提供5种隔离级别,对应解决数据库并发三大问题(脏读、不可重复读、幻读):1.READ_UNCOMMITTED(读未提交):最低级别,可读取未提交数据,存在脏读、不可重复读、幻读,基本不用。2.READ_COMMITTED(读已提交):Oracle默认级别,只能读取已提交数据,解决脏读,存在不可重复读、幻读。3.REPEATABLE_READ(可重复读):MySQL默认级别,解决脏读、不可重复读,存在幻读。4.SERIALIZABLE(串行化):最高级别,所有事务串行执行,解决三大问题,性能极差,极少使用。5.DEFAULT:使用数据库默认隔离级别。4.@Transactional注解失效的场景?(面试超高频)日常开发中最常见的6种失效场景:1.方法非public修饰:Spring事务基于AOP代理,只能拦截public方法,private、protected方法注解失效;2.同类内方法调用:A类无事务方法直接调用本类@Transactional方法,不会走代理,事务失效;解决方案:通过代理对象调用(AopContext);3.异常类型不匹配:默认只回滚RuntimeException和Error,普通Exception检查异常不回滚,需要手动指定rollbackFor=Exception.class;4.异常被手动捕获:方法内部try-catch捕获了所有异常,Spring无法感知异常,不会触发回滚;5.数据库引擎不支持事务:MySQLMyISAM引擎不支持事务,必须使用InnoDB;6.传播属性配置错误:配置为SUPPORTS、NOT_SUPPORTED等非事务属性,导致不开启事务。四、Spring核心注解与常见问题1.@Component、@Service、@Repository、@Controller的区别?本质上功能一致,都是将类交给Spring容器管理,成为Bean,只是语义不同,用于区分不同层级:1.@Component:通用注解,所有层级通用;2.@Service:标注业务逻辑层Service类,语义化区分业务层;3.@Repository:标注数据访问层Mapper/DAO类;4.@Controller:标注Web控制层接口类,接收前端请求。Spring官方推荐按层级使用对应注解,代码可读性更高。2.@Autowired和@Resource的区别?1.来源不同:@Autowired是Spring提供的注解;@Resource是JDK原生注解(Java规范);2.默认注入规则不同:@Autowired默认按类型(byType)注入;@Resource默认按名称(byName)注入,找不到名称再按类型;3.必填属性:@Autowired默认要求依赖必须存在,否则报错,可设置required=false非必填;@Resource无强制必填限制;4.使用场景:开发中优先用@Autowired,配合@Qualifier指定名称,灵活性更高。3.@Configuration和@Component的区别?1.@Configuration专门用于配置类,被该注解标注的类,内部@Bean方法会被代理增强,多次调用同一@Bean方法,始终返回单例对象;2.@Component标注的普通类,内部@Bean方法无代理增强,多次调用会多次创建新对象,无法保证单例;简单说:配置类必须用@Configuration,保证Bean单例,避免重复创建对象。五、Spring面试进阶问题(中高级必问)1.Spring容器的启动流程简单说

温馨提示

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

评论

0/150

提交评论