版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Spring高级面试题及详细答案(实战版)一、Spring核心原理高级考点1.详细说说SpringIoC的三级缓存原理,以及为什么需要三级缓存,二级缓存能不能解决循环依赖?答案:SpringIoC容器解决单例Bean的Setter/字段循环依赖,核心依靠三级缓存机制,三级缓存存储的内容各司其职:一级缓存(singletonObjects):存放完全初始化完成、属性填充完毕、可直接使用的完整单例Bean。二级缓存(earlySingletonObjects):存放已经实例化、但未完成属性填充和初始化的原始Bean对象(半成品Bean),目的是避免重复创建Bean引用。三级缓存(singletonFactories):存放Bean的对象工厂(ObjectFactory),核心作用是支持Bean的AOP代理循环依赖,提前暴露代理对象的引用。循环依赖执行流程:当A、B两个Bean互相依赖时,A先完成实例化,将自身的ObjectFactory放入三级缓存;随后A开始填充属性,需要注入B,触发B的创建;B创建时需要注入A,此时从三级缓存获取A的对象工厂,通过工厂获取A的引用(普通Bean返回原始对象,代理Bean返回代理对象),完成B的初始化后,A继续完成剩余属性填充和初始化,最终将完整A放入一级缓存,删除二、三级缓存中的A数据。为什么二级缓存无法解决循环依赖?如果只保留二级缓存,只能存储原始半成品Bean。若当前Bean需要AOP代理,提前暴露的是原始对象,后续容器最终初始化完成后会生成新的代理对象,就会出现注入的原始对象和最终容器中的代理对象不一致的问题,导致事务、切面等AOP功能失效。三级缓存的对象工厂可以在提前暴露引用时,直接返回代理对象,保证全程对象一致性,这是二级缓存无法替代的核心原因。补充限制:Spring三级缓存只能解决单例、Setter/字段注入的循环依赖,无法解决构造器循环依赖,因为构造器执行在Bean实例化阶段之前,没有机会提前暴露Bean引用。2.SpringBean的生命周期完整流程,包含后置处理器的执行时机?答案:Spring单例Bean完整生命周期按执行顺序分为10个核心步骤,关键后置处理器穿插执行,是面试核心重难点:资源加载与解析:容器启动,加载XML、注解、配置类等配置信息,解析Bean定义,生成BeanDefinition,存储在Bean定义注册表中。Bean实例化:容器根据BeanDefinition,通过反射(无参构造/指定构造器)创建Bean的原始实例对象。Bean属性填充:自动装配依赖Bean,完成@Autowired、@Resource、Setter注入,填充对象属性。前置后置处理器处理:执行BeanPostProcessor的前置处理方法postProcessBeforeInitialization,对半成品Bean进行预处理,常见场景:属性加密、自定义字段赋值。初始化方法执行:依次执行三类初始化逻辑:@PostConstruct注解方法→InitializingBean的afterPropertiesSet方法→配置文件指定的init-method方法。后置后置处理器处理:执行BeanPostProcessor的后置处理方法postProcessAfterInitialization,这是AOP代理生成的核心时机,Spring默认在此处为需要代理的Bean创建动态代理对象。Bean完成初始化:经过上述处理后,Bean成为完整可用对象,单例Bean存入一级缓存。容器运行阶段:接收业务请求,调用Bean的业务方法。销毁前处理:容器关闭时,执行销毁逻辑:@PreDestroy注解方法→DisposableBean的destroy方法→配置文件指定的destroy-method方法。Bean销毁:从容器缓存中移除Bean,资源释放完毕。核心总结:AOP代理是在初始化后置处理器阶段生成,这也是为什么循环依赖需要三级缓存提前暴露代理引用的根本原因。3.Spring中Bean的作用域及底层区别,单例Bean是否线程安全?为什么?答案:Spring核心内置6种Bean作用域,常用的为前4种:singleton(单例,默认):整个IoC容器中仅存在一个Bean实例,容器启动时初始化(非懒加载),全局共享。prototype(多例):每次从容器中获取Bean时,都会创建一个全新的实例,容器只负责创建,不负责销毁。request:每次HTTP请求创建一个新Bean,请求结束Bean销毁。session:每个用户会话对应一个Bean,会话失效Bean销毁。application:绑定ServletContext生命周期,全局web应用唯一。websocket:绑定WebSocket生命周期。单例Bean是否线程安全?非线程安全。Spring单例Bean是单实例、多线程共享,容器只创建一个对象,所有请求线程共用这一个实例。底层原因:线程安全问题的核心是共享可变变量。如果单例Bean中存在成员变量、全局可变属性,多线程同时读写时会出现线程安全问题;如果Bean是无状态的(仅提供方法、无成员变量、无可变属性),则不存在线程安全问题。解决方案:尽量保证Bean无状态,避免定义可变成员变量;将可变变量放入ThreadLocal,实现线程隔离;对需要可变状态的Bean,修改为prototype多例作用域;加锁控制并发读写(不推荐,影响性能)。二、SpringAOP高级考点1.SpringAOP的核心原理、动态代理两种方式的区别,Spring默认使用哪种代理?答案:SpringAOP基于动态代理实现,核心是在不修改业务代码的前提下,对方法进行增强,实现日志、事务、权限、限流等通用功能解耦,遵循切面编程思想。SpringAOP支持两种动态代理机制:(1)JDK动态代理基于Java原生反射实现,只能代理实现了接口的类,通过生成接口的实现类完成代理,无第三方依赖。(2)CGLIB动态代理基于字节码增强技术,可以代理无接口的普通类,通过生成目标类的子类完成重写方法实现代理,需要依赖cglib包(Spring3.2后内置,无需手动引入)。Spring默认代理规则:目标类实现了接口:默认使用JDK动态代理;目标类没有实现接口:自动降级使用CGLIB代理;SpringBoot2.0+默认强制使用CGLIB代理,统一代理方式。两种代理核心区别:JDK代理基于接口,CGLIB代理基于继承;JDK只能代理接口方法,CGLIB可以代理普通类的public方法;CGLIB无法代理final类、final方法、private方法(无法重写);JDK代理效率高、启动快,CGLIB运行效率更高(字节码优化)。2.AOP的五种通知类型及执行顺序,介绍AOP事务失效的常见场景答案:(1)五种通知类型及执行顺序正常执行顺序:前置通知(@Before)→目标方法执行→后置返回通知(@AfterReturning)→最终后置通知(@After)异常执行顺序:前置通知(@Before)→目标方法异常→异常通知(@AfterThrowing)→最终后置通知(@After)环绕通知(@Around):优先级最高,包裹目标方法,可手动控制方法执行、自定义返回值、捕获异常。完整优先级:环绕前置→前置通知→目标方法→环绕后置→后置返回/异常通知→最终后置通知。(2)SpringAOP事务失效高频场景(面试重点)方法访问权限问题:@Transactional注解加在非public方法上,AOP无法拦截,事务失效。SpringAOP仅拦截public方法。内部调用问题:同一个类中,无事务的A方法调用有事务的B方法,事务失效。原因是内部调用不走Spring代理对象,直接调用原生对象方法,无法触发AOP事务增强。异常类型不匹配:默认事务只回滚RuntimeException和Error,若方法抛出普通Exception、自定义受检异常,未手动指定rollbackFor,事务不回滚。异常被手动捕获:方法内部try-catch捕获了所有异常,未向上抛出,AOP无法感知异常,不会触发回滚。多例Bean事务:prototype多例Bean,事务管理器无法统一管理,事务失效。数据库引擎不支持事务:MySQL使用MyISAM引擎(不支持事务),无论如何配置都无法生效,必须使用InnoDB。传播机制使用不当:例如REQUIRES_NEW、NOT_SUPPORTED等传播属性使用错误,导致事务挂起、不开启事务。三、Spring事务高级考点1.Spring事务的七种传播机制,各自适用业务场景答案:Spring事务传播机制用于控制嵌套调用时父子事务的传递规则,七种机制核心区别如下:REQUIRED(默认):当前有事务则加入当前事务,无事务则新建事务。最常用,适用于绝大多数业务增删改场景,保证操作原子性。SUPPORTS:当前有事务则加入,无事务则以非事务方式运行。适用于查询业务,兼容事务和非事务场景。MANDATORY:强制要求当前存在事务,无事务则直接抛出异常。适用于必须在事务中执行的核心业务校验。REQUIRES_NEW:无论当前是否有事务,新建独立事务,挂起父事务。适用于独立日志记录、异步记录、不影响主事务的兜底操作(主事务回滚,子事务不回滚)。NOT_SUPPORTED:始终以非事务方式运行,存在父事务则挂起。适用于非核心查询、统计、日志查询,提升性能。NEVER:强制非事务环境,检测到当前有事务则抛异常。适用于绝对不能在事务中执行的操作。NESTED:嵌套事务,有父事务则在父事务嵌套子事务(保存点机制),子事务独立回滚不影响父事务;无父事务则新建事务。适用于主流程不回滚、子流程可独立回滚的拆分业务。高频面试区分点:REQUIRES_NEW是独立事务,完全隔离;NESTED是嵌套事务,依赖父事务,父事务回滚子事务必须回滚。2.Spring事务的隔离级别,以及脏读、不可重复读、幻读的解决方案答案:Spring事务隔离级别基于数据库隔离级别封装,共5种:DEFAULT:使用数据库默认隔离级别(MySQL默认可重复读,Oracle默认读已提交)。READ_UNCOMMITTED(读未提交):最低级别,可读取未提交数据,存在脏读、不可重复读、幻读,几乎不使用。READ_COMMITTED(读已提交):只能读取已提交数据,解决脏读,存在不可重复读、幻读。Oracle默认级别。REPEATABLE_READ(可重复读):MySQL默认级别,解决脏读、不可重复读,无法解决幻读。SERIALIZABLE(串行化):最高级别,完全串行执行,解决所有读问题,性能极差,极少使用。三类读问题解释及解决方案:脏读:一个事务读取到另一个事务未提交的脏数据。解决方案:设置隔离级别为READ_COMMITTED及以上。不可重复读:同一事务内,两次读取同一数据,结果不一致(其他事务更新并提交数据)。解决方案:设置隔离级别为REPEATABLE_READ及以上。幻读:同一事务内,两次查询数据条数不一致(其他事务新增/删除数据并提交)。MySQLInnoDB通过间隙锁+行锁解决幻读,而非单纯依靠隔离级别。四、Spring容器高级特性1.Spring的BeanFactory和ApplicationContext的区别答案:BeanFactory是SpringIoC容器的顶层核心接口,是Spring容器的最基础规范;ApplicationContext是BeanFactory的子接口,是BeanFactory的增强扩展。核心区别:功能层面:BeanFactory仅提供基础的Bean获取、判断是否存在、获取Bean类型等基础功能;ApplicationContext除基础功能外,提供国际化、事件发布、资源加载、环境配置、AOP自动适配、注解扫描等高级功能。Bean初始化时机:BeanFactory是懒加载,只有调用getBean()时才会创建Bean;ApplicationContext容器启动时预加载所有单例Bean,启动完成后所有单例Bean已初始化完毕。使用场景:BeanFactory适合简单、资源受限的场景;ApplicationContext是项目开发中默认使用的容器(ClassPathXmlApplicationContext、AnnotationConfigApplicationContext)。2.Spring事件驱动机制原理及使用场景答案:Spring事件驱动基于观察者模式实现,核心三要素:事件、事件发布器、事件监听器。核心组件:ApplicationEvent:自定义事件父类,所有业务事件需要继承该类;ApplicationEventPublisher:事件发布接口,用于发布自定义事件;ApplicationListener:事件监听接口,或使用@EventListener注解实现监听。执行流程:业务方法发布事件→容器匹配对应监听器→执行监听处理逻辑。使用场景:解耦业务逻辑,例如用户注册成功后,异步发送短信、邮件、初始化用户数据、记录操作日志等,避免主业务流程臃肿。高级特性:默认同步执行,可通过@Async实现异步监听,提升接口响应速度;支持事件层级、批量监听。五、Spring注解高级考点1.@Autowired和@Resource的底层区别,为什么@Autowired默认按类型注入?答案:(1)核心区别来源不同:@Autowired是Spring自定义注解;@Resource是JSR250Java标准注解,兼容性更强。注入规则不同:@Autowired默认按类型(byType)注入;@Resource默认按名称(byName)注入,找不到名称再按类型。必填属性:@Autowired默认要求Bean必须存在,可通过required=false设置非必填;@Resource无必填配置,找不到Bean直接报错。依赖限定:@Autowired配合@Qualifier可指定Bean名称,解决同类型多Bean冲突;@Resource可直接通过name属性指定Bean。(2)@Autowired默认按类型注入的底层原因SpringIoC容器的核心设计是基于类型管理Bean,容器中会维护类型与Bean的映射关系。@Autowired的底层处理
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年旅游行业旅游导游岗位考试模拟题及答案详解
- 2026年国职健身教练证模拟试卷目(含答案)
- 瓦楞纸箱成型工安全强化知识考核试卷含答案
- 2026年河南英语4级模拟试题(含答案)
- 2026年北森测评晋升模拟试题(含答案)
- 2026年财贸分类模拟试卷(含答案)
- 2026年儿童保健测试模拟试题(含答案)
- 2026年单词速记模拟试卷(含答案)
- 2026年残联专职模拟试卷目(含答案)
- 2026年工业农业区位模拟试题(含答案)
- 2026-2030中国红枣市场经营效益分析及未来销售趋势规划研究报告
- (正式版)DB36∕T 1392-2021 《生产安全事故隐患排查治理体系建设通则》
- (2026年)护士条例课件
- 2026年重庆入团测考试题库(b卷)
- 2025-2026华为ICT大赛-基础软件赛道理论考试题库(核心500题)
- 9.《复活(节选)》课件+2025-2026学年统编版高二语文选择性必修上册
- 中草药栽种劳动课课件
- 大蜜丸炼蜜工艺优化研究
- 中国非遗文化课件幼儿园
- T/ACSC 01-2022辅助生殖医学中心建设标准
- 2025年云上贵州大数据(集团)有限公司招聘笔试参考题库含答案解析
评论
0/150
提交评论