版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Spring高频面试题及详细答案(实战口语版)一、Spring基础核心1.简单说说你对Spring的理解?Spring核心作用是什么?Spring是一个轻量级的Java开发框架,核心就是帮我们解耦,简化项目开发,不用自己手动造各种基础轮子。它最核心的两个点是IOC和AOP,除此之外,Spring还提供了事务管理、Bean管理、整合各种第三方框架的能力,能让业务代码更纯粹,不用关注对象创建、资源管理这些杂事。简单说:Spring就是帮我们统一管理对象、统一控制流程、统一管理事务,让开发更高效、代码更解耦。2.什么是IOC?IOC的实现原理是什么?IOC就是控制反转,说白了就是把对象的创建、依赖赋值、生命周期管理,从程序员代码里交给Spring容器来做。以前我们开发是new对象、手动赋值依赖,主动权在代码里;IOC之后,主动权交给容器,需要用什么对象,容器直接注入进来,这就是控制反转。底层实现原理:1.项目启动时,Spring扫描所有带注解/配置的类;2.通过反射机制实例化Bean对象;3.根据依赖关系自动装配属性;4.把初始化完成的Bean放到单例池(Map)里,后续直接取用。3.IOC和DI的区别?很多人会混淆,其实很好区分:IOC是思想、是理论:反转对象控制权,容器管理对象;DI是实现手段、是落地方式:依赖注入,就是容器把依赖的对象自动赋值给当前Bean。简单讲:IOC是目的,DI是实现IOC的方式。4.SpringBean的生命周期?(面试必背完整版)完整流程按执行顺序来,一共7步,我按实际启动流程说:1.实例化:Spring通过反射new出Bean对象,此时只是空对象,属性还没赋值;2.属性填充(依赖注入):自动装配@Autowired、构造器、set方法的依赖属性;3.前置处理(BeanPostProcessor前置):Spring内置后置处理器做预处理,比如解析注解;4.初始化方法执行:先执行InitializingBean的afterPropertiesSet,再执行@PostConstruct、init-method;5.后置处理(BeanPostProcessor后置):这里会生成AOP代理对象,是原生对象还是代理对象就在这一步决定;6.Bean就绪:初始化完成,放入单例池,供业务调用;7.销毁:容器关闭时,执行@PreDestroy、destroy-method销毁方法。高频考点:AOP代理是在Bean初始化后置处理阶段完成的,不是实例化阶段。5.SpringBean的作用域有哪些?常用的是哪个?Spring一共6种作用域,实际开发常用的就两个:1.singleton(单例):默认作用域,整个Spring容器中只创建一个Bean,全局共享,性能最高,业务组件基本都是单例;2.prototype(多例):每次获取Bean都会新建一个对象,适合有状态、线程不安全的对象;3.request:一次HTTP请求一个Bean;4.session:一个浏览器会话一个Bean;5.application:整个web应用一个;6.websocket:websocket会话级别。面试重点:单例Bean是线程不安全的,所以开发中不要在Bean中定义成员变量,避免多线程数据错乱。6.Spring单例Bean是线程安全的吗?为什么?怎么解决?不是线程安全的。因为Spring单例Bean全局只有一个对象,所有请求线程共用这一个对象。如果Bean里有成员变量,多线程同时读写这个变量就会出现数据覆盖、错乱问题。解决方案:1.尽量不要在Service、Controller中定义成员变量;2.有状态变量用ThreadLocal隔离线程;3.必要时把Bean改成多例(prototype),不推荐滥用,会占用内存。7.Spring依赖注入的三种方式?推荐用哪种?三种注入方式:1.构造器注入:通过类构造方法注入依赖;2.Set方法注入:通过setXxx方法注入;3.字段注入(@Autowired直接注解字段)。开发推荐:构造器注入原因:1.保证对象初始化完成后依赖一定存在,不会出现空指针;2.保证依赖不可变,避免运行过程中被修改;3.方便单元测试,不依赖Spring容器也能手动传参实例化;4.Spring官方从4.3之后就推荐构造器注入。字段注入虽然简洁,但容易造成循环依赖、隐藏依赖过多问题,不推荐。8.什么是循环依赖?Spring怎么解决循环依赖?循环依赖:两个或多个Bean互相依赖,比如A依赖B,B又依赖A,启动时互相等待对方创建完成。Spring能解决的场景:单例Bean、字段/set方法的循环依赖。Spring解决核心:三级缓存1.一级缓存(singletonObjects):存放完全初始化好的单例Bean;2.二级缓存(earlySingletonObjects):存放已经实例化、但还没完成初始化的原始Bean对象;3.三级缓存(singletonFactories):存放Bean的工厂对象,用于提前暴露对象引用。简单流程:A先实例化,把自己的工厂放入三级缓存,再去注入B;B实例化后从三级缓存拿到A的引用,完成初始化,A再完成后续步骤,解决互相等待问题。无法解决的场景:构造器注入的循环依赖,直接报错,因为构造器实例化就需要依赖对象,没有提前暴露引用的机会。二、SpringAOP核心9.什么是AOP?核心作用是什么?AOP是面向切面编程,就是在不修改原有业务代码的前提下,对方法进行增强。核心思想:把通用、重复的逻辑抽离成切面,比如日志、事务、权限校验、限流,统一切入到目标方法前后,实现业务和通用逻辑解耦。一句话总结:业务代码只管业务,通用功能交给切面。10.AOP核心术语解释?1.切面(Aspect):封装通用逻辑的类,就是我们写的@Aspect类;2.连接点(JoinPoint):可以被增强的方法,项目里大部分方法都是连接点;3.切入点(Pointcut):我们真正选中、要增强的方法,通过表达式匹配;4.通知(Advice):切面里具体执行的增强逻辑,分为前置、后置、异常、最终、环绕通知;5.目标对象:被增强的原始Bean对象;6.代理对象:AOP生成的代理对象,最终执行的是代理对象的方法。11.AOP的五种通知类型及执行顺序?1.@Before:前置通知,目标方法执行前执行;2.@AfterReturning:后置正常返回通知,方法正常结束无异常才执行;3.@AfterThrowing:异常通知,方法抛出异常时执行;4.@After:最终通知,不管方法正常结束还是报错,都会执行;5.@Around:环绕通知,可以手动控制目标方法是否执行、前后逻辑。完整执行顺序:环绕前置→前置通知→目标方法执行→环绕后置→正常后置/异常通知→最终通知。12.SpringAOP动态代理两种方式?区别是什么?SpringAOP自动适配两种代理:1.JDK动态代理:基于接口代理,目标类必须实现接口,代理对象和目标对象实现同一个接口;2.CGLIB代理:基于子类继承代理,不用实现接口,直接继承目标类生成子类作为代理对象。核心区别:1.有接口默认JDK代理,无接口强制CGLIB;2.JDK只能代理接口方法,CGLIB可以代理普通方法;3.SpringBoot2.0之后默认使用CGLIB代理。13.AOP为什么无法拦截内部调用?(高频坑点)很多人写代码遇到过:同一个类里,A方法调用本类的B方法,B方法的切面不生效。原因:AOP增强走的是代理对象,而本类内部调用是原生对象this调用,没有经过代理对象,所以切面无法拦截。解决办法:1.把被调用方法抽离到其他类;2.通过AopContext获取当前代理对象调用方法;3.自己注入自己,用注入的对象调用。三、Spring事务核心(面试重点)14.Spring事务的实现原理?Spring事务本质就是AOP动态代理+数据库事务。1.程序调用带@Transactional注解的方法时,先走AOP切面;2.切面前置开启数据库事务;3.执行目标业务方法;4.方法正常执行完毕,切面提交事务;5.方法抛出指定异常,切面回滚事务。15.Spring事务的传播属性?重点讲常用的一共7种传播属性,面试常问5个核心的:1.REQUIRED(默认):当前有事务就加入,没有就新建事务;最常用;2.SUPPORTS:有事务就加入,没事务就非事务运行;3.MANDATORY:必须在事务内运行,没有事务直接报错;4.REQUIRES_NEW:新建独立事务,挂起当前事务,互不影响;5.NESTED:嵌套事务,依赖父事务,父事务回滚子事务一定回滚,子事务回滚不影响父事务。16.Spring事务隔离级别?对应数据库四种隔离级别,Spring封装了5种:1.DEFAULT:使用数据库默认隔离级别(MySQL默认可重复读);2.READ_UNCOMMITTED:读未提交,基本不用;3.READ_COMMITTED:读已提交,解决脏读,Oracle默认;4.REPEATABLE_READ:可重复读,解决脏读、不可重复读,MySQL默认;5.SERIALIZABLE:串行化,最高级别,解决所有并发问题,性能最差。17.@Transactional失效的6种场景(超高频面试题)这是面试必问,实际开发也经常踩坑,我整理最全的:1.方法不是public:Spring事务只对public方法生效,private、protected直接失效;2.内部调用:同类方法this调用,不走代理,事务失效;3.异常类型不对:默认只回滚RuntimeException和Error,普通Exception不回滚;如果需要全部回滚,要指定rollbackFor=Exception.class;4.异常被try-catch捕获:代码手动捕获异常,没有抛出,切面感知不到异常,不会回滚;5.数据库引擎不支持事务:比如MySQL用MyISAM引擎,必须用InnoDB;6.传播属性配置错误:比如配置成SUPPORTS、NOT_SUPPORTED等导致无事务运行。四、Spring核心拓展面试题18.Spring中FactoryBean和BeanFactory的区别?两个名字很像,完全不是一个东西:BeanFactory:Spring顶层容器接口,是工厂,负责Bean的创建、获取、管理,是SpringIOC容器的核心;FactoryBean:是一个特殊的Bean,用来帮我们生产复杂对象,比如Mybatis的SqlSessionFactory、Redis连接工厂这种复杂对象,普通注解不好创建,就用FactoryBean自定义构建。一句话:BeanFactory是管理Bean的工厂,FactoryBean是生产复杂Bean的工具。19.Spring容器的启动流程?简单说核心步骤1.加载配置类/配置文件,扫描所有需要托管的Bean;2.解析Bean定义,注册到BeanDefinition注册表;3.刷新容器,开始批量实例化单例Bean;4.完成Bean依赖注入、初始化、AOP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年二建实务机电模拟试题(含答案)
- 2026年钻井模拟考试试卷及答案详解
- 民用阀门及管道连接件制作工安全生产能力考核试卷含答案
- 花卉加工工保密意识竞赛考核试卷含答案
- 2026年企业运营模拟题及答案详解
- 味精发酵工道德能力考核试卷含答案
- 2026年湖南辅警考试模拟试卷(含答案)
- 玻璃钢制品灌注工岗前安全生产能力考核试卷含答案
- 2026年福州学位英语模拟试题(含答案)
- 2026年蘑菇中毒模拟题及答案详解
- 26秋季小学道德与法治五年级上册第9课-综合国力日益提升-2课时教学设计
- 反诈知识竞赛考试题库(100题含答案)
- 2025年绩效考核管理考试真题及答案
- 江苏经贸辅导员笔试真题2026
- 工业铸造行业分析报告
- 三甲药物警戒制度规范
- 飞行员心理培训课件
- (2025年)(完整版)建筑工地三级安全教育试题(附答案)
- 铁路道口工安全培训讲义课件
- 2025-2026学年广东广州南武中学九年级(上)期中数学试题含答案
- 可视喉镜使用方法
评论
0/150
提交评论