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

下载本文档

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

文档简介

Spring框架高频面试题及详细真实答案(实战版)一、Spring基础核心面试题1.简单说说你对Spring框架的理解Spring是一款轻量级的Java开源分层框架,核心目的是简化Java企业级开发,解决传统J2EE开发臃肿、耦合度高的问题。它不是替代任何框架,而是整合、管理各类组件,让项目开发更轻量化、解耦更彻底。Spring最核心的两大思想就是IoC(控制反转)和AOP(面向切面编程)。基于这两个核心,延伸出了Bean管理、事务控制、依赖注入、切面增强等核心功能,同时可以无缝整合MyBatis、Redis、MQ等主流技术,是Java后端开发的基础框架。2.Spring的核心组件和核心模块有哪些?日常开发中最核心的四个组件:BeanFactory:Spring最底层的Bean工厂,负责Bean的创建和管理,是SpringIoC容器的顶层接口,功能简单,延迟加载Bean。ApplicationContext:BeanFactory的子接口,也是我们开发常用的容器,拓展了国际化、事件发布、资源加载、即时加载Bean等功能。Bean:Spring容器中管理的所有对象,统一由容器创建、初始化、销毁,不用开发者手动new对象。Context:Spring的运行上下文,保存容器所有资源、配置、Bean信息。核心模块:spring-core:核心工具类、基础通用功能spring-beans:Bean的定义、加载、依赖注入核心逻辑spring-context:容器拓展功能、企业级通用能力spring-aop:面向切面编程核心实现spring-tx:事务管理核心模块spring-web:web项目适配、SpringMVC基础支撑3.BeanFactory和ApplicationContext的区别?这是面试高频基础题,核心区别集中在加载机制和功能丰富度:加载时机不同:BeanFactory是延迟加载,只有调用getBean()时才会创建Bean;ApplicationContext是容器启动立即加载所有单例Bean,启动时就能发现配置问题。功能不同:BeanFactory仅具备基础的Bean创建、获取功能;ApplicationContext额外支持资源加载、事件监听、国际化、切面自动代理、环境配置等企业级功能。使用场景:BeanFactory适合资源受限的嵌入式、小型项目;我们常规Web项目、SpringBoot项目,默认使用ApplicationContext。二、IoC控制反转与依赖注入1.什么是IoC?控制反转到底反转了什么?IoC全称控制反转,是Spring的核心设计思想。传统开发中,我们需要对象时,都是自己new创建、自己管理对象的依赖关系,对象的创建、销毁、依赖管理的控制权在开发者手中。引入SpringIoC后,控制权反转给了Spring容器:所有对象(Bean)的创建、初始化、依赖装配、销毁都由Spring容器统一管理,开发者不用手动维护对象依赖。简单说:反转的不是代码逻辑,是对象资源的控制权,从程序员手动控制,变成容器自动控制。2.什么是DI依赖注入?IoC和DI的关系?DI依赖注入是IoC的具体实现方式。IoC是设计思想,DI是落地手段。当一个Bean需要依赖另一个Bean时,不需要自己主动new,而是由Spring容器在创建Bean时,自动把依赖的对象注入进来,这就是依赖注入。举个实战例子:Service层需要Mapper,我们不用在Service里newMapper,直接@Autowired注入即可,底层就是Spring完成的DI。3.Spring依赖注入的三种方式,各自优缺点?Spring支持三种注入方式,目前开发中首选构造器注入:(1)构造器注入通过类的构造方法注入依赖,Spring4.3之后,单Bean构造器可省略@Autowired。优点:保证对象初始化完成后一定是完整可用的,避免空指针、保证依赖不可变、彻底解决循环依赖(单例场景)、符合单一职责。缺点:依赖过多时构造方法会臃肿,也是类职责过重的信号,便于代码自查。(2)setter方法注入通过set方法注入依赖,适合可选依赖、动态修改依赖的场景。优点:灵活,对象创建后可以动态修改依赖。缺点:无法保证对象初始化后依赖一定存在,容易出现空指针,也会导致循环依赖问题。(3)字段注入(@Autowired直接注解字段)日常新手常用,写法简单,但开发规范中不推荐。优点:代码简洁、书写方便。缺点:隐藏依赖关系、容易产生循环依赖、不利于单元测试、违反单一职责原则,Spring官方也不推荐使用。4.@Autowired和@Resource的区别?这是面试必问,核心区别在来源、匹配规则、默认行为:来源不同:@Autowired是Spring提供的注解;@Resource是JSR250Java原生规范注解,兼容性更好。匹配规则不同:@Autowired默认按类型注入,同类型多Bean时报错,需要配合@Qualifier指定名称;@Resource默认按名称注入,找不到名称再按类型匹配。必填属性:@Autowired默认required=true,必须找到对应Bean,否则报错;@Resource没有强制必填限制。三、SpringBean核心面试题1.SpringBean的生命周期?详细流程Bean生命周期是面试高频重点,完整实战流程如下:资源加载与解析:Spring启动,扫描配置类、注解、XML,解析所有Bean的定义信息(BeanDefinition)。实例化:容器根据BeanDefinition,通过反射创建Bean的空对象(此时属性都是默认值,未赋值)。属性填充(依赖注入):Spring自动完成依赖注入,给对象的属性赋值(@Autowired、构造器注入等)。前置处理(BeanPostProcessor前置):执行Bean后置处理器的前置方法,对Bean做预处理,AOP代理也在此阶段触发。初始化:先执行InitializingBean的afterPropertiesSet方法,再执行自定义init-method初始化方法。后置处理(BeanPostProcessor后置):对初始化完成的Bean做最终处理,生成代理Bean。就绪使用:Bean完成创建,放入单例池,供业务代码调用。销毁:容器关闭时,执行DisposableBean的destroy方法、自定义destroy-method,销毁Bean资源。2.Bean的作用域有哪些?常用的两种区别?Spring提供6种Bean作用域,开发中只用前两种:singleton(单例,默认):整个Spring容器中只创建一个Bean实例,容器启动时初始化(非延迟),全局共享。注意:单例Bean是非线程安全的,不能在Bean中定义成员变量。prototype(多例):每次调用getBean、注入使用时,都会创建一个全新的Bean实例,Spring容器只负责创建,不负责多例Bean的销毁。request、session、application、websocket:仅Web环境生效,日常开发几乎不用。3.单例Bean是线程安全的吗?为什么?不安全,这是实战高频问题。Spring的单例Bean是容器级别单例,全局只有一个对象实例。如果Bean中定义了成员变量,多个线程同时访问、修改这个成员变量时,会出现线程安全问题。解决方案:日常开发中,Controller、Service、Dao层Bean一律不定义可修改的成员变量;如需存储变量,使用ThreadLocal保证线程隔离,或者改用多例Bean。4.Spring循环依赖是什么?怎么解决的?循环依赖场景:A依赖B,B又依赖A,两个Bean互相依赖,导致无法正常创建。Spring支持的场景:仅支持单例模式下的setter/字段注入循环依赖,不支持构造器注入循环依赖、多例循环依赖。核心解决原理:三级缓存一级缓存(singletonObjects):存放完全初始化好的完整单例Bean二级缓存(earlySingletonObjects):存放实例化完成、未填充属性的半成品Bean三级缓存(singletonFactories):存放Bean的工厂对象,用于提前暴露Bean引用解决流程:A实例化后,先把自己的工厂对象放入三级缓存,再去注入B;B创建时需要A,从三级缓存拿到A的引用,完成B的初始化;B初始化完成后,A继续完成属性填充和初始化,最终两个Bean正常创建,解决循环依赖。补充:构造器注入无法解决,因为构造器必须一次性拿到完整依赖,没有半成品创建过程,无法借助三级缓存。四、SpringAOP核心面试题1.什么是AOP?核心作用是什么?AOP面向切面编程,是Spring的第二大核心思想,核心是解耦通用横切逻辑。日常开发中有很多通用逻辑:日志记录、权限校验、事务控制、限流、监控统计,这些逻辑和业务代码无关,却需要在多个方法中重复使用。AOP可以把这些横切公共逻辑抽离成切面,在不修改原有业务代码的前提下,对目标方法进行增强,实现代码解耦、统一维护。2.AOP核心术语(面试常问)切入点(Pointcut):需要被增强的目标方法,通过表达式匹配(execution、annotation等)。通知(Advice):切面的具体增强逻辑,分为前置、后置、异常、最终、环绕通知。切面(Aspect):切入点+通知的结合体,就是我们定义的切面类。连接点(JoinPoint):所有可以被增强的方法,是切入点的父集。织入(Weaving):将切面逻辑植入目标方法的过程,Spring是运行时织入。3.SpringAOP的两种动态代理区别?默认用哪种?SpringAOP底层基于两种动态代理实现,默认优先JDK动态代理:(1)JDK动态代理基于接口实现,目标类必须实现接口,否则无法使用。代理对象是接口的实现类,性能较好,是Spring默认代理方式。(2)CGLIB动态代理基于继承实现,通过继承目标类生成子类作为代理对象,无需接口。可以代理普通类、无接口的类。触发场景:目标类没有实现接口、强制指定使用CGLIB代理。核心区别总结:有接口用JDK代理,无接口用CGLIB代理;SpringBoot2.0之后默认开启CGLIB代理。4.AOP五种通知的执行顺序?正常无异常执行顺序:环绕前置通知→前置通知→目标方法执行→后置返回通知→后置最终通知→环绕后置通知出现异常执行顺序:环绕前置通知→前置通知→目标方法报错→异常通知→后置最终通知(后置返回不执行)五、Spring事务核心面试题(重点)1.Spring事务的实现方式两种实现方式,开发中100%使用注解式:编程式事务:手动编写事务开启、提交、回滚代码,代码侵入性强,极少使用。声明式事务:基于AOP实现,通过@Transactional注解开启事务,无代码侵入,简洁高效,主流方案。2.@Transactional注解失效的场景(面试高频)这是面试和实战最常踩坑的点,核心失效场景:方法非public:SpringAOP只拦截public方法,private/protected方法注解失效。内部调用:同一个类中,A方法(无事务)调用本类B方法(有@Transactional),事务失效。原因:AOP代理失效,绕过了代理对象,直接调用原方法。异常类型不对:默认只回滚RuntimeException和Error,普通CheckedException(编译时异常)不回滚,需要手动指定rollbackFor。异常被手动捕获:方法内部try-catch捕获了异常,没有抛出,Spring无法感知异常,不会回滚。多例Bean:多例Bean不受Spring容器事务管理,注解失效。数据库不支持事务:MySQLMyISAM引擎不支持事务,必须用InnoDB。3.Spring事务的传播机制(重点掌握常用7种)事务传播机制是指:当一个带事务的方法被另一个方法调用时,事务如何传递,核心常用5种:REQUIRED(默认):有事务就加入,无事务就新建。最常用,适合绝大多数业务场景。SUPPORTS:有事务就加入,无事务就非事务运行。MANDATORY:必须在事务内运行,无事务直接报错。REQUIRES_NEW:无论是否有事务,新建独立事务,挂起原有事务。适合日志记录、异步兜底场景。NESTED:嵌套事务,依赖父事务,父事务回滚子事务必须回滚,子事务回滚不影响父事务。NOT_SUPPORTED、NEVER:极少使用,基本不考察。4.事务的隔离级别?默认级别是什么?Spring兼容数据库四种隔离级别,解决脏读、不可重复读、幻读问题:READ_UNCOMMITTED:读未提交,存在脏读、不可重复读、幻读,几乎不用。READ_COMMITTED:读已提交,解决脏读,存在不可重复读、幻读(Oracle默认)。REPEATABLE_READ:可重复读,解决脏读、不可重复读,存在幻读(MySQL默认、Spring默认)。SERIALIZABLE:串行化,解决所有并发问题,性能极低,基本不用。六、高频综合面试题1.Spring中Bean的加载流程?1.容器启动,加载配置类、扫描包路径;2.解析所有类,生成BeanDefinition注册到注册表;3.遍历BeanDefinition,

温馨提示

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

评论

0/150

提交评论