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

下载本文档

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

文档简介

Spring高频面试题及详细答案(实战版)1、简单说说你对Spring框架的理解?Spring是一款轻量级的Java开源分层框架,核心目的是简化企业级Java开发,降低代码耦合度,让项目开发、维护、扩展更便捷。它最核心的两大思想是IOC(控制反转)和AOP(面向切面编程),同时提供了事务管理、依赖注入、资源整合、Web开发支持等全套能力。Spring不是替代其他框架,而是整合各类技术的中间框架,日常开发中SSM、SpringBoot、SpringCloud生态都是基于Spring核心延伸而来,适配单体、分布式各类项目场景。2、什么是IOC?控制反转怎么理解?IOC全称控制反转,是Spring的核心设计思想。简单来说,就是把对象的创建、管理、依赖关系的控制权,从开发者代码中交给Spring容器。传统开发中,我们需要使用对象时,会手动new对象、管理对象依赖,控制权在开发者手中;而IOC模式下,开发者只需要声明依赖,对象的实例化、生命周期管理全部由Spring容器负责,控制权发生了反转。IOC的核心作用就是解耦,彻底消除代码中的硬编码依赖,让类与类之间的依赖关系由容器维护,极大提升代码的复用性和可维护性。3、什么是DI?DI和IOC的区别?DI是依赖注入,是IOC的具体实现方式。IOC是一种设计思想、设计模式,描述的是控制权反转的理念;而DI是落地手段,指Spring容器自动将对象所需要的依赖组件,注入到当前对象中。举个通俗的例子:IOC是“不用自己造对象,容器统一管理”的思想,DI是“容器主动把需要的对象给你送过来”的操作。日常开发中@Autowired、@Resource都是依赖注入的具体应用。4、Spring依赖注入的三种方式?优缺点对比?Spring支持构造器注入、setter方法注入、字段注入三种方式。1.构造器注入(官方推荐)通过类的构造方法传入依赖,Spring4.3+版本中,单构造器可省略@Autowired。优点:保证对象初始化时依赖完全,避免空指针;保证依赖不可变;保证线程安全,适合必须依赖的组件。缺点:依赖过多时构造方法会臃肿,可及时拆分类解决。2.Setter方法注入通过setXxx方法注入依赖,适合可选依赖、动态修改的依赖。优点:灵活,对象创建后可动态修改依赖。缺点:无法保证依赖必填,可能出现依赖缺失导致空指针。3.字段注入(@Autowired直接注解字段)开发最简洁,代码量最少,但官方不推荐。缺点:容易导致类职责不单一、依赖泛滥;隐藏依赖关系,不利于代码阅读;容易产生循环依赖问题,单元测试不方便。5、SpringBean的生命周期?详细执行流程SpringBean完整生命周期分为6个核心步骤,面试常用完整版流程:1.实例化:Spring容器启动扫描配置,通过反射创建Bean实例,此时只是空对象,属性未赋值。2.属性填充(依赖注入):容器解析依赖,通过DI完成属性赋值、自动装配。3.前置处理:执行BeanPostProcessor的前置初始化方法,对Bean进行前置增强。4.初始化:先执行InitializingBean的afterPropertiesSet方法,再执行自定义的init-method初始化方法。5.后置处理:执行BeanPostProcessor的后置初始化方法,完成Bean的最终增强(AOP代理在此步骤生成)。6.销毁:容器关闭时,执行DisposableBean的destroy方法和自定义destroy-method销毁方法。6、SpringBean的作用域有哪些?常用的区别?Spring内置6种作用域,开发最常用的是singleton和prototype:1.singleton(单例,默认)整个Spring容器中只存在一个Bean实例,容器启动时完成初始化(非懒加载),全局共享。适用:无状态组件,如Controller、Service、Dao。2.prototype(多例)每次从容器中获取Bean都会创建新实例,容器只负责创建,不管理多例Bean的销毁。适用:有状态、需要独立实例的组件。3.request:每次HTTP请求创建一个新Bean,请求结束销毁。4.session:每个用户会话对应一个Bean,会话过期销毁。另外还有application、websocket作用域,日常开发极少使用。7、Spring单例Bean是线程安全的吗?为什么?不安全。Spring的单例Bean是容器级别的单例,全局只有一个实例,所有请求、所有线程都会共用这一个对象。如果Bean中存在成员变量(有状态),多线程并发修改时会出现线程安全问题;如果Bean无成员变量、只有方法(无状态),则线程安全。日常开发中Service、Controller、Mapper都是无状态单例,所以不会出现线程安全问题;如果自定义单例Bean存在共享变量,需要加锁、ThreadLocal或改为多例模式解决。8、Spring循环依赖是什么?怎么解决的?循环依赖场景:A类依赖B类,B类又依赖A类,导致容器初始化时互相依赖、无法完成创建。Spring可解决的场景:单例Bean、setter/字段注入的循环依赖。Spring无法解决的场景:构造器注入的循环依赖、多例Bean循环依赖。解决原理(三级缓存)Spring通过三级缓存存储不同生命周期的Bean,提前暴露未完成初始化的Bean引用,打破循环依赖:1.一级缓存:存放完整初始化完成的单例Bean;2.二级缓存:存放已实例化、未填充属性的Bean实例;3.三级缓存:存放Bean的工厂对象,用于提前暴露Bean引用,解决代理对象循环依赖问题。简单流程:A实例化后存入三级缓存,提前暴露引用,B加载时从三级缓存获取A的引用完成注入,后续A完成初始化后升级到一级缓存。9、什么是AOP?核心概念和使用场景AOP即面向切面编程,是Spring核心特性之一,核心作用是在不修改原有业务代码的前提下,对方法进行增强,实现业务逻辑与通用逻辑的解耦。通用日志、事务、权限校验、限流、缓存、异常处理等通用逻辑,都可以通过AOP统一处理,避免代码冗余。AOP核心概念1.切面(Aspect):封装通用逻辑的类;2.连接点(JoinPoint):可以被增强的方法;3.切入点(Pointcut):筛选需要增强的连接点,通过表达式匹配;4.通知(Advice):具体的增强逻辑,分为前置、后置、环绕、异常、最终通知;5.目标对象:被增强的原始业务对象;6.代理对象:AOP生成的增强后的对象。10、SpringAOP的动态代理两种方式?区别?SpringAOP底层默认使用两种动态代理机制,自动适配:1.JDK动态代理基于接口实现,要求目标类必须实现接口,只能代理接口中的方法。2.CGLIB动态代理基于子类继承实现,无需接口,通过继承目标类生成子类作为代理对象,可以代理普通类、无接口类。核心区别1.依赖不同:JDK依赖接口,CGLIB依赖继承;2.范围不同:JDK只能代理接口方法,CGLIB可代理普通方法;3.版本变化:Spring3.2之后默认使用CGLIB,SpringBoot2.x之后全部默认CGLIB代理。11、AOP五种通知的执行顺序?正常执行顺序:前置通知@Before→环绕通知@Around(执行前)→目标方法执行→环绕通知(执行后)→后置返回通知@AfterReturning→最终通知@After异常执行顺序:前置通知→环绕通知(执行前)→目标方法报错→异常通知@AfterThrowing→最终通知@After(无后置返回通知)12、Spring事务的传播机制有哪些?常用的几种详解Spring一共7种事务传播机制,核心常用5种:1.REQUIRED(默认)当前有事务就加入,没有就新建事务。最常用,适配绝大多数业务场景。2.SUPPORTS当前有事务就加入,没有就以非事务方式执行。适合查询类方法。3.MANDATORY强制要求在事务内执行,当前无事务直接报错。4.REQUIRES_NEW新建独立事务,暂停当前已有事务,内外事务互不影响,各自独立回滚。适合日志记录、异步记录等不受主事务影响的场景。5.NESTED嵌套事务,依赖外层事务,有保存点,内层异常可单独回滚,外层异常会导致内层全部回滚。13、Spring事务的隔离级别?各自解决什么问题?Spring基于数据库实现5种隔离级别,对应解决脏读、不可重复读、幻读问题:1.READ_UNCOMMITTED:读未提交,存在脏读、不可重复读、幻读,几乎不用;2.READ_COMMITTED(Oracle默认):读已提交,解决脏读,存在不可重复读、幻读;3.REPEATABLE_READ(MySQL默认):可重复读,解决脏读、不可重复读,存在幻读;4.SERIALIZABLE:串行化,最高级别,解决所有并发问题,性能极低;5.DEFAULT:使用底层数据库默认隔离级别,开发默认使用该配置。14、@Transactional事务失效的常见场景?面试高频考点,日常开发最容易踩坑的场景:1.方法非public:SpringAOP只拦截public方法,private、protected方法事务失效;2.内部调用:同类中普通方法调用本类@Transactional方法,绕过代理对象,事务失效;3.异常类型不对:默认只回滚RuntimeException、Error,捕获Exception不回滚,需要手动配置rollbackFor;4.异常被手动捕获:方法内try-catch捕获所有异常,未抛出,事务无法感知异常,不会回滚;5.数据库引擎不支持事务:MySQL使用MyISAM引擎,无事务能力,必须使用InnoDB;6.传播机制配置错误:如配置SUPPORTS、NOT_SUPPORTED等导致事务不生效。15、Spring中@Autowired和@Resource的区别?1.来源不同:@Autowired是Spring注解,@Resource是JSR250原生Java注解;2.注入规则不同:@Autowired默认按类型byType注入;@Resource默认按名称byName注入,找不到名称再按类型;3.必填性不同:@Autowired默认必须找到Bean,否则报错,可通过required=false取消限制;@Resource非必填;4.适配场景:Spring项目优先用@Autowired,需要按名称精准匹配时用@Resource。16、Spring配置类@Configuration和@Bean的作用?@Configuration用于标记配置类,替代传统xml配置文件,专门用来统一注册第三方组件、配置参数。@Bean注解在方法上,方法返回值会注册为SpringBean,交由容器管理,默认方法名作为Bean名称。重点区别:@Configuration修饰的类会被CGLIB代理,内部调用@Bean方法会返回容器单例,保证单例;普通@Component类中定义@Bean无法保证单例。17、Spring容器启动流程简单描述?1.初始化容器上下文,加载配置信息(注解、配置文件);2.扫描项目所有带注解的组件(@Component、@Service、@Controller等),生成Bean定义信息;3.刷新容器,触发Bean实例化、依赖注入、初始化流程;4.加载AOP、事务等后置处理器,完成代理增强;5.

温馨提示

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

评论

0/150

提交评论