版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Spring源码高频面试题及真实面试版答案一、Spring核心容器基础源码1.简单说下SpringIoC的核心原理,底层是怎么实现的?参考答案:IoC核心就是控制反转、依赖注入,说白了就是把对象的创建、依赖管理、生命周期全部交给Spring容器,程序员不用手动new对象、手动赋值依赖。底层实现流程分四步:1.资源加载解析:启动时读取XML、注解、配置类等配置信息,扫描所有需要交给容器管理的类;2.Bean定义解析注册:把扫描到的类解析成BeanDefinition(Bean的元数据信息,包含类路径、作用域、依赖、初始化方法等),统一注册到BeanDefinition注册表;3.Bean实例化:容器启动完成前,对单例非懒加载的Bean,通过反射创建对象实例;4.依赖注入+初始化:自动装配依赖属性,执行前置后置处理器、初始化方法,最终生成完整可用的Bean存入单例池。2.BeanFactory和ApplicationContext的区别?面试常问参考答案:BeanFactory是Spring最顶层的IoC容器根接口,是Spring容器的基础,只提供了最核心的Bean获取、判断Bean是否存在的功能,延迟初始化Bean,只有getBean的时候才会创建对象,资源占用小。ApplicationContext是BeanFactory的子类扩展接口,是我们实际开发用的容器,在BeanFactory基础上做了大量增强:1.自动加载配置、自动扫描Bean;2.容器启动时提前初始化所有单例Bean,启动后直接使用;3.支持事件发布、国际化、资源加载、AOP集成等高级功能;简单总结:BeanFactory是基础,ApplicationContext是完整版的工厂。3.SpringBean的完整生命周期,按源码执行顺序说一遍参考答案:我按源码真实执行流程梳理,没有多余步骤:1.实例化:容器通过反射调用无参构造,创建Bean空对象;2.属性填充(依赖注入):自动装配@Autowired、set方法、构造器依赖,给对象赋值;3.Bean前置处理:执行BeanPostProcessor的前置处理方法,可修改Bean属性、生成代理对象;4.初始化方法执行:先执行Aware系列接口(BeanNameAware、BeanFactoryAware等),再执行@PostConstruct、init-method自定义初始化方法;5.Bean后置处理:执行BeanPostProcessor后置方法,SpringAOP的代理对象就是这一步生成的;6.Bean就绪:完成所有流程,存入单例池,供业务调用;7.销毁:容器关闭时,执行@PreDestroy、destroy-method销毁方法。4.Spring单例Bean是线程安全的吗?源码层面怎么理解?参考答案:Spring的单例Bean本身不是线程安全的。首先Spring的单例是容器级单例,整个容器中只有一个Bean对象,所有请求线程共用这一个对象。如果Bean中存在成员变量,多线程同时读写会出现线程安全问题;如果是无状态Bean(只有方法、没有成员变量),就是线程安全的。源码层面:单例Bean创建完成后存入singletonObjects单例池,全局唯一,不会重复创建。解决方式一般是用ThreadLocal、改成多例Bean,或者避免定义可变成员变量。5.Spring的三级缓存是干嘛的?源码解决了什么问题?参考答案:三级缓存核心作用:解决Spring单例Bean的循环依赖问题(仅限setter/字段注入,不支持构造器循环依赖)。三级缓存对应三个Map:1.一级缓存(singletonObjects):存放完全初始化好的完整单例Bean;2.二级缓存(earlySingletonObjects):存放已经实例化、但还没完成属性填充和初始化的半成品Bean;3.三级缓存(singletonFactories):存放Bean的工厂对象(Lambda表达式),用于提前生成Bean引用,同时支持AOP代理Bean的循环依赖。核心流程:Bean创建后先放入三级缓存,依赖注入时如果发现循环依赖,从三级缓存获取引用,初始化完成后升级到一级缓存,清空二、三级缓存。补充:构造器循环依赖无法解决,因为构造器创建对象前没有半成品对象,无法提前暴露引用。二、SpringAOP源码核心面试题1.SpringAOP的底层原理,源码执行流程?参考答案:SpringAOP核心是动态代理,默认规则:接口用JDK动态代理,无接口用CGLIB代理。源码核心流程:1.容器启动时扫描切面类、切点表达式,解析所有通知(前置、后置、环绕、异常通知);2.在Bean的后置处理器阶段(AbstractAutoProxyCreator),判断当前Bean是否匹配切点;3.如果匹配,通过动态代理生成代理对象,替换原Bean存入容器;4.业务调用时,执行代理对象的拦截逻辑,先执行通知,再执行目标方法。2.JDK动态代理和CGLIB代理的区别?Spring如何选择?参考答案:1.JDK动态代理:基于接口代理,只能代理实现了接口的类,效率高,JDK原生支持,无需引入依赖;2.CGLIB代理:基于继承子类代理,无需接口,通过字节码增强实现,可以代理普通类、final方法除外的类;Spring选择规则:Spring5之前:有接口默认JDK代理,无接口CGLIB;Spring5及以后:默认全部使用CGLIB代理,统一代理方式。3.AOP的执行顺序,多个切面如何排序?参考答案:正常执行顺序:环绕前置→前置通知→目标方法→后置返回→环绕后置→最终后置,出现异常会执行异常通知,跳过后置返回。多个切面排序:通过@Order注解或者实现Ordered接口设置优先级,数值越小优先级越高,优先级高的切面先进后出(外层包裹内层)。三、Spring事务源码面试题1.Spring事务底层原理是什么?参考答案:Spring事务本质是AOP动态代理,基于TransactionInterceptor事务拦截器实现。源码流程:1.容器启动时解析@Transactional注解,标记需要事务增强的Bean;2.通过AOP生成代理对象,调用方法时进入事务拦截器;3.拦截器先判断方法事务属性,开启事务、获取数据库连接;4.执行目标业务方法,正常执行则提交事务;出现异常(默认RuntimeException、Error)则回滚事务;5.释放连接、关闭事务。2.Spring事务失效的常见场景(源码角度解释)参考答案:所有事务失效本质都是没有走AOP代理调用,拦截器没有生效:1.方法内部自调用:同类中A方法调用本类带事务的B方法,this调用而非代理对象调用,不会触发拦截;2.方法非public:Spring事务拦截器只拦截public方法,private/protected无法被代理增强;3.异常类型不对:默认只回滚运行时异常和错误,普通CheckedException不回滚;4.传播机制使用不当:比如REQUIRES_NEW、SUPPORTS使用错误导致事务不生效;5.数据库不支持事务:MyISAM引擎不支持事务,InnoDB才支持。3.说说Spring事务的传播属性,常用的几个参考答案:重点记开发最常用的5个:1.REQUIRED(默认):有事务就加入,没事务就新建一个事务;2.REQUIRES_NEW:无论是否有事务,都新建独立事务,旧事务挂起,互不影响;3.SUPPORTS:有事务就加入,没事务就非事务执行;4.MANDATORY:必须在事务内执行,没有事务直接报错;5.NESTED:嵌套事务,有父事务则作为子事务,可单独回滚子事务,不影响父事务。四、Spring核心拓展点源码面试题1.BeanPostProcessor和BeanFactoryPostProcessor的区别?参考答案:核心区别:执行时机、作用对象完全不同1.BeanFactoryPostProcessor:作用于Bean工厂,在Bean定义加载完成、Bean实例化之前执行,用来修改BeanDefinition元数据、修改配置参数;2.BeanPostProcessor:作用于具体Bean,在Bean实例化、属性填充完成后,初始化前后执行,用来修改Bean实例、生成代理对象(AOP核心依赖它)。2.Spring的Aware接口有什么用?常见的有哪些?参考答案:Aware是Spring提供的容器回调接口,作用是让Bean能感知Spring容器资源,获取容器中的对象和配置,打破Bean和容器的解耦。常见几个:1.BeanNameAware:获取当前Bean的名称;2.BeanFactoryAware:获取Bean工厂对象;3.ApplicationContextAware:获取Spring应用上下文;4.EnvironmentAware:获取系统环境、配置参数。3.@Autowired和@Resource的底层源码区别?参考答案:1.来源不同:@Autowired是Spring注解,@Resource是JSR250Java原生注解;2.装配规则不同:@Autowired默认按类型装配,配合@Qualifier
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年有限空间作业考试题及答案
- 2026年太空能力测试题及答案
- 2026年全国港口危险货物安全管理人员考试题库含答案
- 2026年国企改革与管理考试试卷及答案
- 公关部品牌推广效果评估表
- 2026年事业单位招聘医院药师专业知识专项试卷
- 开展新项目立项讨论的通知函(7篇)范文
- 新产品价格体系正式实施公告(7篇范文)
- 研发总监技术创新贡献绩效考核表
- 海岸带生态修复方案指导
- 建筑工程施工基坑土方开挖施工技术交底
- 肿瘤患者心脏毒性防治专家共识
- 城区生活垃圾分类和处理项目社会稳定风险评估报告
- 2026主题公园配套酒店运营模式与收益分析报告
- 人工智能通识基础教程 课件 第二章 人工智能语言Python基础
- T∕SHAEPI 026-2025 污染土壤修复工厂建设规范
- 高职院校单招考试总复习指导与同步练 英语
- 5水平二 跑 《迎面接力跑》 教案
- 企业《环保督察自查清单》2025中央生态环境保护督察
- 广东省小学课本《信息技术》第二册(上)教案
- T/SSR 705-2024空调器用全铝微通道热交换器腐蚀性能评价值及试验方法
评论
0/150
提交评论