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

下载本文档

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

文档简介

Spring核心面试题及详细答案(实战版)1.简单说说你对Spring的理解,Spring的核心是什么?Spring是一款轻量级的Java开源分层框架,主要用于解决企业级开发中代码耦合度高、开发繁琐的问题,几乎是Java后端开发的基础框架,大部分主流框架都基于Spring拓展而来。Spring核心就两个:IOC(控制反转)和AOP(面向切面编程)。IOC的核心是把对象的创建、管理、依赖注入权限交给Spring容器,不用开发者手动new对象,大幅降低代码耦合;AOP核心是在不修改原有业务代码的前提下,对方法进行增强,实现日志、事务、权限等通用功能的解耦。2.什么是IOC?控制反转和依赖注入的区别?IOC(控制反转)是一种设计思想,传统开发中,开发者主动创建、管理对象,控制权在程序代码本身;而IOC是将对象的控制权反转交给Spring容器,由容器统一创建、销毁、装配对象,实现组件解耦。依赖注入(DI)是IOC思想的具体实现方式。简单说,IOC是思想,DI是落地手段。举个实战例子:Service层需要调用Dao层,传统写法是Service里newDao(),代码硬耦合;Spring中只需在Service中定义Dao属性,通过注解或配置让Spring自动注入Dao对象,无需手动创建,这就是依赖注入。常见的注入方式三种:构造器注入、setter方法注入、字段注入(@Autowired)。3.Spring中三种依赖注入方式的优缺点?项目中用哪种?(1)字段注入(@Autowired)优点:写法最简单、代码简洁,日常开发最常用;缺点:容易导致类依赖过多,不易排查循环依赖,违背单一职责原则,单元测试不方便。(2)setter方法注入优点:适合可选依赖,对象创建后可以动态修改依赖,灵活性高;缺点:依赖不固定,可能出现对象未注入就使用的空指针问题。(3)构造器注入(官方推荐)优点:保证对象初始化时所有必填依赖全部注入,避免空指针,保证对象不可变,有效解决循环依赖问题,便于单元测试;缺点:依赖过多时构造方法参数冗长。项目实战用法:必填依赖用构造器注入,可选依赖用setter注入,日常快速开发偶尔用字段注入,严格规范的项目优先统一构造器注入。4.什么是SpringBean?Bean的生命周期是什么?SpringBean就是Spring容器管理的普通Java对象,被Spring创建、装配、销毁,所有被@Component、@Service、@Controller等注解标识的类,都会被Spring扫描并交给容器管理,成为Bean。完整Bean生命周期(实战核心流程):1.扫描加载:Spring启动时,扫描配置的包路径,读取所有Bean定义信息;2.实例化:容器根据Bean定义,通过反射创建Bean实例;3.属性填充(依赖注入):自动完成属性、依赖对象的注入;4.初始化前置处理:执行Bean后置处理器的前置方法;5.初始化:执行InitializingBean接口方法、自定义init-method;6.初始化后置处理:执行Bean后置处理器的后置方法(AOP代理就是这一步完成);7.就绪使用:Bean完成初始化,存入单例池,供业务调用;8.销毁:容器关闭时,执行DisposableBean接口方法、自定义destroy-method。5.SpringBean的作用域有哪些?默认是什么?Spring共6种作用域,开发常用的只有2种:1.singleton(单例):默认作用域,整个Spring容器中只创建一个Bean实例,全局共享,性能高,无状态Bean首选(Service、Dao默认单例);2.prototype(多例):每次从容器获取Bean都会创建一个新实例,有状态、需要独立实例的场景使用;3.request:一次HTTP请求一个实例;4.session:一个用户会话一个实例;5.application:一个Web应用一个实例;6.websocket:一个WebSocket连接一个实例。面试重点:单例Bean是线程不安全的,因为全局共享,多线程并发修改成员变量会出现数据错乱,所以开发中单例Bean禁止定义可变成员变量。6.Spring单例Bean的线程安全问题怎么解决?核心原则:Spring单例Bean本身无状态、无成员变量就是线程安全的,出问题都是因为定义了可变成员变量。实战解决方案:1.尽量不定义可变成员变量,业务数据通过方法参数传递;2.用ThreadLocal存储线程私有变量,实现线程隔离;3.必要时将Bean改为多例作用域(prototype);4.加锁(synchronized/lock),不推荐,会降低并发性能。7.什么是AOP?AOP的核心概念和应用场景?AOP(面向切面编程),是一种横向增强代码的技术,核心是在不修改原有业务代码的前提下,对方法进行拦截、增强,剥离通用重复逻辑,实现代码解耦。AOP核心术语(面试必背):-连接点:可以被拦截的点,项目中主要就是所有方法;-切入点:真正被拦截的方法,通过表达式匹配(execution、annotation);-通知(增强):拦截方法后执行的逻辑,分为前置、后置、异常、最终、环绕通知;-切面:切入点+通知的结合体,就是我们写的切面类;-织入:将切面代码植入目标方法的过程。实战应用场景:统一日志记录、方法耗时统计、权限校验、事务控制、接口防重复提交、参数校验。8.SpringAOP的五种通知执行顺序?正常无异常执行顺序:环绕前置通知→前置通知→目标方法执行→后置返回通知→后置最终通知→环绕后置通知目标方法出现异常执行顺序:环绕前置通知→前置通知→目标方法报错→异常通知→后置最终通知(后置返回、环绕后置不执行)9.SpringAOP动态代理的两种方式?区别是什么?SpringAOP底层默认两种代理方式,自动适配:(1)JDK动态代理基于接口实现,必须目标类有接口才能使用,JDK原生支持,无需依赖第三方包,代理类和目标类实现同一个接口。(2)CGLIB代理基于子类继承实现,无需接口,直接继承目标类生成子类代理对象,适合无接口的普通类。核心区别:1.JDK代理需要接口,CGLIB不需要;2.JDK是原生API,CGLIB基于字节码生成,效率略低;3.Spring默认规则:目标类有接口用JDK代理,无接口用CGLIB;SpringBoot2.0之后默认全部使用CGLIB代理。10.Spring事务的传播机制有哪些?常用的是哪几种?Spring事务一共有7种传播机制,开发常用4种,面试重点掌握核心场景:1.REQUIRED(默认):当前有事务就加入,没有就新建事务,最常用、默认级别;2.SUPPORTS:当前有事务就加入,没有就非事务运行;3.MANDATORY:必须在事务内运行,没有事务直接报错;4.REQUIRES_NEW:无论当前是否有事务,都新建一个独立事务,挂起原有事务;5.NOT_SUPPORTED:始终非事务运行,挂起原有事务;6.NEVER:强制非事务,存在事务直接报错;7.NESTED:嵌套事务,依赖父事务,父事务回滚子事务必须回滚,子事务回滚不影响父事务。11.Spring事务失效的场景(高频面试)这是实战和面试高频点,日常开发最容易踩坑的场景:1.方法非public修饰:Spring事务基于AOP代理,只能拦截public方法,private/protected方法事务失效;2.同类方法内部调用:A方法(无事务)调用本类带事务的B方法,事务失效,因为是原生对象调用,不是代理对象调用;3.异常类型不匹配:默认只捕获RuntimeException和Error,普通CheckedException不回滚,需要手动指定rollbackFor;4.异常被try-catch捕获:方法内手动捕获异常不抛出,Spring无法感知异常,不会触发回滚;5.数据库引擎不支持事务:MySQL的MyISAM引擎不支持事务,必须用InnoDB;6.传播机制配置错误:配置为SUPPORTS、NOT_SUPPORTED等非事务传播级别。12.@Autowired和@Resource的区别?1.来源不同:@Autowired是Spring自带注解,@Resource是JSR250Java原生规范注解;2.默认注入规则不同:@Autowired默认按类型注入,@Resource默认按名称注入;3.依赖强制性:@Autowired默认必须找到Bean,否则报错,可通过required=false取消强制;@Resource找不到才会报错,无强制配置;4.适用场景:Spring项目优先用@Autowired,需要按名称精准匹配时用@Resource。13.Spring的循环依赖是什么?怎么解决的?循环依赖:两个或多个Bean互相依赖,比如A依赖B,B又依赖A,启动时出现循环嵌套依赖问题。Spring可解决的场景:单例Bean、字段/setter注入的循环依赖;无法解决的场景:构造器注入的循环依赖、多例Bean循环依赖。核心解决原理(三级缓存):1.一级缓存(singletonObjects):存放完全初始化好的单例Bean;2.二级缓存(earlySingletonObjects):存放实例化完成、未赋值未初始化的半成品Bean;3.三级缓存(singletonFactories):存放Bean工厂对象,用于提前暴露Bean实例。流程简单说:A实例化后先放入三级缓存,再填充属性需要B,B创建后反向依赖A,从三级缓存拿到A半成品,完成B初始化,A再完成后续初始化,最终解决循环依赖。14.@Component、@Service、@Controller、@Repository区别?本质上功能一致,都是将类交给Spring容器管理,成为Bean,只是为了分层语义区分:1.@Component:通用组件注解,所有层级通用;2.@Service:专门用于业务层Service,语义化标识业务逻辑类;3.@Controller:专门用于控制层,接收前端请求,SpringMVC专用;4.@Repository:专门用于数据持久层Dao,操作数据库。底层后三

温馨提示

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

评论

0/150

提交评论