版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Spring高频面试题及真实口语化答案一、Spring基础核心面试题1.简单说说你对Spring框架的理解Spring是一款轻量级的Java开源分层框架,核心目的就是简化Java开发,降低项目耦合度。它最核心的两大特性是IOC控制反转和AOP面向切面编程。日常开发中,Spring主要负责管理项目里所有的组件对象,统一处理对象的创建、依赖注入、生命周期管理,同时能通过切面统一处理日志、事务、权限等通用功能,不用在业务代码里重复写冗余逻辑,让代码更简洁、复用性更强。2.什么是IOC?IOC的实现原理是什么?IOC就是控制反转,简单说就是把对象的创建、依赖管理的权力,从程序员代码手里交给Spring容器。传统开发是我们主动new对象、赋值依赖,主动权在程序手里;IOC模式下我们只需要声明依赖,Spring容器会自动创建对象、装配依赖,主动权反转给了容器。它的核心实现原理主要三点:第一,读取配置文件或者注解标识,扫描项目中的Bean;第二,通过反射机制实例化对象;第三,解析对象之间的依赖关系,自动完成属性注入,最后将初始化完成的Bean放入单例池统一管理。3.什么是DI?DI和IOC的区别是什么?DI是依赖注入,就是Spring容器自动给Bean注入所需要的依赖对象,不用我们手动赋值。常见的注入方式有三种:构造器注入、setter方法注入、字段注解注入。两者的关系很简单:IOC是思想、是理论,DI是实现IOC的具体手段。IOC描述的是权力反转的设计理念,DI是落地这个理念的具体操作,Spring就是通过依赖注入,完成了控制反转的效果。4.SpringBean的生命周期是什么?我按实际执行顺序梳理,完整的Bean生命周期分为这几步:1.容器启动,Spring扫描注解/配置,加载Bean的定义信息;2.通过反射创建Bean的实例对象;3.自动完成依赖属性的注入;4.执行Bean的前置处理(BeanPostProcessor前置方法);5.执行初始化方法(@PostConstruct、init-method、InitializingBean);6.执行BeanPostProcessor后置方法,完成Bean最终加工;7.初始化完成,Bean存入单例池,供业务调用;8.容器关闭时,执行销毁方法(@PreDestroy、destroy-method、DisposableBean)。日常开发中,最常用的就是实例化、属性注入、初始化、销毁这四个核心阶段。5.SpringBean的作用域有哪些?默认是什么?Spring一共提供6种作用域,开发中常用的只有2种:1.singleton:单例,默认作用域,整个容器中只创建一个Bean实例,全局共享;2.prototype:多例,每次从容器获取Bean,都会创建一个全新的实例;剩下的request、session、application、websocket是web专属作用域,普通Spring项目用不到。补充一点:单例Bean是线程不安全的,所以开发中尽量不要在Bean中定义可变的成员变量。6.单例Bean的线程安全问题怎么解决?Spring的单例Bean是全局共享的,多线程并发访问时,如果存在可变成员变量,就会出现线程安全问题。常用解决方案:1.尽量避免在Bean中定义可变成员变量,把变量定义在方法内部,方法变量是线程私有的;2.使用ThreadLocal存储线程专属变量,隔离多线程数据;3.对修改共享变量的代码加锁,保证原子性;4.必要时将Bean改为多例作用域,但不推荐,会增加内存开销。二、SpringAOP核心面试题1.什么是AOP?有什么应用场景?AOP是面向切面编程,核心思想是在不修改原有业务代码的前提下,对方法进行增强。它能把项目中通用的、重复的逻辑抽离出来,统一管理,实现业务代码和通用逻辑的解耦。日常开发常见场景:统一日志记录、事务控制、权限校验、接口限流、性能耗时统计、缓存处理等。2.AOP的核心术语有哪些?1.切面(Aspect):封装通用逻辑的类,也就是我们写的切面类;2.连接点(JoinPoint):可以被切面拦截的所有方法;3.切入点(Pointcut):我们精准筛选出来、需要真正拦截的方法;4.通知(Advice):切面中具体执行的增强逻辑,分为前置、后置、异常、最终、环绕通知;5.目标对象:被切面拦截的原始类对象;6.织入:把切面增强逻辑嵌入到目标方法的过程。3.AOP的五种通知类型及执行顺序1.@Before前置通知:目标方法执行前执行;2.@AfterReturning后置返回通知:目标方法正常执行完毕、返回结果后执行,异常时不执行;3.@AfterThrowing异常通知:目标方法抛出异常时执行;4.@After最终通知:无论方法正常结束还是抛出异常,都会执行;5.@Around环绕通知:包裹目标方法,可手动控制方法何时执行,功能最强大。正常执行顺序:环绕前置→前置通知→目标方法执行→环绕后置→后置返回→最终通知异常执行顺序:环绕前置→前置通知→目标方法报错→异常通知→最终通知4.SpringAOP的动态代理机制,JDK代理和CGLIB代理的区别SpringAOP底层就是动态代理,两种代理方式区别很明确:1.JDK动态代理:基于接口实现,只能代理实现了接口的类,通过反射生成接口的代理对象,性能较高,JDK原生支持;2.CGLIB动态代理:基于子类继承实现,可以代理没有接口的普通类,通过字节码增强生成目标类的子类作为代理对象,无法代理被final修饰的类和方法。Spring5之后默认使用CGLIB代理,不管类有没有接口,统一用CGLIB,省去了切换的麻烦。三、Spring事务面试题(高频重点)1.Spring事务的实现原理Spring事务底层基于AOP动态代理实现。简单说就是:当我们给方法加上@Transactional注解后,Spring会通过AOP拦截该方法,在方法执行前开启事务,方法正常执行完毕后提交事务,如果执行过程中抛出异常,就自动回滚事务,全程不用手动写commit、rollback代码。2.Spring事务的传播机制有哪些?常用的是哪几个?Spring一共7种事务传播机制,开发中最常用的3种:1.REQUIRED(默认):如果当前有事务,就加入当前事务;如果没有,就新建一个事务;2.REQUIRES_NEW:不管当前有没有事务,都新建一个独立事务,挂起原有事务;3.SUPPORTS:有事务就加入,没事务就以非事务方式运行;其余NOT_SUPPORTED、MANDATORY、NEVER、NESTED多用于特殊业务场景,日常使用较少。3.Spring事务的隔离级别对应数据库的事务隔离级别,Spring封装了5种:1.DEFAULT:默认,沿用底层数据库的隔离级别(MySQL默认可重复读);2.READ_UNCOMMITTED:读未提交,会出现脏读、不可重复读、幻读;3.READ_COMMITTED:读已提交,解决脏读,存在不可重复读、幻读;4.REPEATABLE_READ:可重复读(MySQL默认),解决脏读、不可重复读,存在幻读;5.SERIALIZABLE:串行化,最高级别,解决所有并发问题,性能最差。4.@Transactional注解失效的场景(超级高频)这是面试必问,我总结了最常见的6种失效场景:1.方法不是public修饰,Spring无法生成代理,事务不生效;2.同类中方法内部调用,比如A方法无注解,调用本类带注解的B方法,事务失效(绕过了代理对象);3.异常类型不对,默认只回滚RuntimeException和Error,普通CheckedException不回滚;4.手动捕获了异常,没有抛出,Spring无法感知异常,不会回滚;5.数据库引擎不支持事务,比如MySQL用了MyISAM引擎,必须用InnoDB;6.事务传播机制配置错误,比如配置了SUPPORTS、NOT_SUPPORTED等。四、Spring注解与核心机制面试题1.@Component、@Service、@Controller、@Repository的区别四个注解功能本质一样,都是将类交给Spring管理,注册为Bean,只是语义不同,用于区分不同层级:1.@Component:通用注解,所有层级都能用,属于父注解;2.@Service:专门用于业务逻辑层;3.@Controller:专门用于控制层,接收前端请求;4.@Repository:专门用于数据持久层。2.三种依赖注入方式的优缺点1.字段注入(@Autowired直接注解字段):写法最简单、代码简洁,日常开发最常用,但容易导致类依赖过多,不利于代码解耦和单元测试;2.setter注入:适合可选依赖,对象创建后可以动态修改依赖,但是注入繁琐;3.构造器注入:Spring官方推荐,能保证依赖不可为空、对象初始化完整性,方便单元测试,缺点是依赖多的时候构造方法参数过长。3.@Autowired和@Resource的区别1.来源不同:@Autowired是Spring提供的注解,@Resource是JDK原生注解;2.注入规则不同:@Autowired默认按类型注入,找不到Bean会报错,可搭配@Qualifier按名称注入;@Resource默认按名称注入,名称找不到再按类型注入;3.适用范围不同:@Resource只能注解字段和setter方法,@Autowired可以注解构造器、方法、字段。五、Spring高级面试题1.Spring容器的启动流程核心流程分为几步:1.初始化容器上下文,加载配置信息(注解、配置文件);2.扫描项目包路径,解析所有Bean的定义信息;3.执行Bean工厂的后置处理器,修改Bean定义;4.批量实例化所有单例、非懒加载的Bean;5.完成Bean的依赖注入、初始化方法执行;6.注册钩子、发布容器刷新完成事件,容器启动完成。2.什么是BeanFactory和ApplicationContext?区别是什么?BeanFactory是Spring最底层的Bean工厂接口,是Spring容器的顶层接口,只提供了基础的Bean获取、判断功能,Bean是懒加载模式,使用时才创建;ApplicationContext是BeanFactory的子类,是我们实际使用的Spring容器上下文。它在BeanFactory基础上,扩展了国际化、事件发布、资源加载、容器刷新、前置后置处理器等丰富功能,启动时会一次性初始化所有单例Bean,功能更全面,开发中全部使用ApplicationContext。3.Spring中循环依赖是什么?怎么解决的?循环依赖就是A类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 产品召回及赔偿声明函(7篇范文)
- 智能零售平台用户画像构建方案
- 2026年高压电工基础理论考试题库及答案-考点梳理与练习
- 污水在线运维考试题库及答案
- 农业经济专业知识和实务经济师考试(中级)试卷及答案
- 2026年眼镜验光员(五十九级)眼镜行业法规评估考试试卷及答案
- 网络综合布线理论测试题(含答案)
- 2026年氢站考试题库及答案
- 2027届湖南省汨罗市沙溪中学中考物理猜题卷含解析
- 2026年官方兽医网牧运通考试题库附完整答案详解(典优)
- 2026国企招聘考试(文秘)历年参考题库含答案详解
- 2026数学新教材 数学广角:搭配问题 课件 人教版(新教材)三年级数学上册
- 市场营销:理论与中国实践(第4版数字教材版)课件 第11章 营销传播
- 食堂后厨岗位流程标准化SOP
- 2026年秋统编版(新教材)九年级道德与法治上册(全册)每课核心知识点清单梳理
- 2025年上海客运驾驶员试题及答案
- 肺动脉CTA检查课件
- 巴塞尔协议书iii
- (正式版)DB13 2322-2025 《工业企业挥发性有机物排放控制标准》
- 第12课 家乡新变化(教学课件)小学二年级上册 统编版《道德与法治》新教材
- 2025年全国HIV抗体诊断试剂临床质量评估报告范文
评论
0/150
提交评论