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

下载本文档

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

文档简介

JavaSpring高频面试题及详细答案(实战版)一、Spring基础核心面试题1.简单说说你对Spring框架的理解?Spring是一款轻量级的Java开源分层框架,核心目的是简化企业级Java开发,降低代码耦合度,让项目开发、维护、扩展更高效。它不是单一框架,是一套完整的生态,核心两大思想是IoC(控制反转)和AOP(面向切面编程)。同时整合了事务管理、Web开发、数据操作等能力,市面上主流的SSM、SpringBoot、SpringCloud技术栈都是基于Spring衍生而来。日常开发中,Spring主要帮我们解决两个核心问题:对象的统一管理、业务逻辑的解耦。2.Spring的核心模块有哪些?Spring由多个独立模块组成,常用核心模块如下:SpringCore/Beans:Spring最底层核心,提供IoC容器、Bean工厂,负责所有对象的创建、管理、依赖注入。SpringContext:在Core基础上扩展,提供国际化、事件发布、资源加载、容器上下文等高级功能。SpringAOP:提供面向切面编程的能力,实现日志、权限、事务等通用功能的解耦。SpringJDBC:简化JDBC数据库操作,封装重复代码,降低数据库开发难度。SpringTransaction:声明式事务管理,统一管理数据库事务,不用手动写事务提交、回滚代码。SpringWebMVC:Spring自带的Web框架,实现MVC架构,用于接口开发、请求接收与响应。3.Spring优缺点是什么?优点:解耦性强,通过IoC容器管理对象,彻底摆脱手动new对象的方式,降低代码依赖。AOP可以抽取通用公共逻辑,减少代码冗余。声明式事务极大简化事务开发,稳定性高。开源、轻量、生态完善,兼容性好,能无缝整合MyBatis、Redis、MQ等主流框架。分层架构清晰,适配不同层级的开发需求。缺点:使用原生Spring需要大量XML配置,繁琐且冗余(SpringBoot已解决该问题)。底层原理较深,不熟悉原理容易出现循环依赖、事务失效、Bean覆盖等线上问题。框架层级多,新手入门有一定学习成本。二、IoC与Bean核心面试题(高频)4.什么是IoC?控制反转怎么理解?IoC全称控制反转,是Spring的核心设计思想。简单来说就是把对象的创建、管理、依赖关系的控制权,从开发者代码中交给Spring容器。传统开发中,我们需要依赖某个类,就自己new对象,控制权在开发者手里;使用Spring后,我们只需要声明依赖,不需要手动创建对象,由Spring容器统一实例化、管理对象,这就是控制反转。IoC的核心作用就是解耦,所有Bean统一由容器管理,方便统一维护、扩展和替换。5.什么是DI依赖注入?和IoC的区别?DI依赖注入是IoC的具体实现方式。IoC是思想,DI是落地手段。容器创建好Bean对象后,自动将对象依赖的属性、其他Bean注入到当前对象中,无需手动赋值,这个过程就是依赖注入。二者区别:IoC:是设计思想,控制权反转。DI:是具体实现,容器自动完成依赖赋值。6.Spring依赖注入的三种方式?推荐哪种?三种注入方式:属性注入(@Autowired):直接在类属性上加注解,最简单,日常开发最常用。缺点是容易产生循环依赖,隐性依赖过多。Setter方法注入:通过set方法注入,适合可选依赖,对象创建后可动态修改依赖。构造器注入:通过构造方法注入,Spring官方推荐。推荐构造器注入原因:保证对象初始化完成后,依赖一定存在,避免空指针。有效避免循环依赖问题。保证类的不可变性,依赖一旦注入不可修改,更安全。7.SpringBean的生命周期?(必考题)完整生命周期分为6个核心步骤,面试直接背这套流程即可:实例化:Spring容器根据配置,通过反射创建Bean实例,此时只是空对象,属性未赋值。属性填充(依赖注入):容器自动扫描依赖,完成属性注入、自动装配。初始化前置处理:执行BeanPostProcessor前置处理方法,对Bean做前置增强。初始化:执行InitializingBean接口方法、自定义init-method初始化方法。初始化后置处理:执行BeanPostProcessor后置方法,完成Bean最终增强(AOP代理就是在这里生成)。销毁:容器关闭时,执行DisposableBean接口或自定义destroy-method销毁方法。8.Bean的作用域有哪些?默认是什么?Spring提供6种作用域,开发常用2种:singleton(默认):单例,整个Spring容器中只存在一个Bean实例,容器启动时初始化。prototype:多例,每次从容器获取Bean都会新建一个实例。request:一次HTTP请求一个实例。session:一个会话一个实例。application:整个Web应用一个实例。websocket:WebSocket会话作用域。注意点:单例Bean是非线程安全的,开发中禁止在Bean中定义成员变量,避免多线程数据错乱。9.Spring循环依赖是什么?怎么解决的?循环依赖场景:A依赖B,B又依赖A,两个Bean互相依赖,导致无法正常创建。Spring支持的循环依赖:仅支持setter/属性注入的单例循环依赖。构造器注入的循环依赖无法解决,会直接报错。解决原理(三级缓存):一级缓存:存放完整初始化好的单例Bean。二级缓存:存放原始Bean对象(已实例化、未填充属性)。三级缓存:存放Bean的工厂对象,用于提前暴露未完成初始化的Bean。简单流程:A先实例化,放入三级缓存,再填充属性需要B;B实例化后需要A,从三级缓存拿到A的引用完成注入,各自初始化完成后升级到一级缓存,解决循环依赖。三、AOP面试高频题10.什么是AOP?应用场景有哪些?AOP面向切面编程,是通过动态代理的方式,在不修改原有业务代码的前提下,对方法进行增强,抽取公共通用逻辑,实现业务与通用逻辑解耦。日常开发场景:统一日志记录(入参、出参、异常日志)统一权限校验事务控制接口耗时统计、限流、防抖数据脱敏、缓存更新11.AOP的核心术语你怎么理解?切点(Pointcut):需要被拦截的方法,通过表达式匹配。通知(Advice):拦截方法后执行的增强逻辑,分为前置、后置、异常、最终、环绕通知。切面(Aspect):切点+通知的结合体,就是我们定义的切面类。连接点(JoinPoint):所有可以被拦截的方法,是切点的父集。织入(Weaving):将切面增强逻辑植入目标方法的过程。12.SpringAOP动态代理两种方式?区别?SpringAOP底层两种代理:JDK动态代理:基于接口实现,目标类必须有接口,代理对象和目标对象实现相同接口,性能高。CGLIB代理:基于子类继承实现,无需接口,通过继承目标类生成子类做代理,可以代理普通类。Spring选择规则:目标类有接口,默认使用JDK代理;无接口,自动使用CGLIB;SpringBoot2.0之后默认统一使用CGLIB。四、Spring事务高频面试题(重点)13.Spring事务的实现方式?两种方式:编程式事务:手动开启、提交、回滚事务,代码侵入性强,几乎不用。声明式事务:基于注解@Transactional实现,低侵入、简洁,项目主流用法。14.@Transactional事务失效的场景?(超级高频)工作中最常遇到的8种失效场景,面试直接答核心点:方法不是public修饰,事务无法被Spring拦截增强。类内部方法调用(this.方法),绕过代理对象,事务失效。异常类型不对:默认只捕获RuntimeException,普通Exception不会回滚。手动try-catch捕获了异常,Spring无法感知异常,不会回滚。数据库引擎不支持事务(如MyISAM,必须InnoDB)。传播机制使用不当,导致事务嵌套异常。多线程环境下,子线程事务和主线程独立,互不影响。事务方法被final、static修饰,无法生成代理,事务失效。15.Spring事务传播机制有哪些?常用的?共7种传播机制,开发常用3种:REQUIRED(默认):当前有事务就加入,没有就新建事务(最常用)。REQUIRES_NEW:无论当前是否有事务,都新建一个独立事务,互不影响。SUPPORTS:有事务就加入,没有就非事务运行。NOT_SUPPORTED:始终非事务运行。MANDATORY:必须在事务内运行,无事务直接报错。NEVER:必须非事务运行,有事务报错。NESTED:嵌套事务,依赖父事务,父事务回滚子事务全部回滚。16.事务的隔离级别?解决什么问题?数据库三大并发问题:脏读、不可重复读、幻读。Spring对应5种隔离级别:READ_UNCOMMITTED:读未提交,无法解决任何问题,基本不用。READ_COMMITTED(MySQL默认):读已提交,解决脏读,存在不可重复读、幻读。REPEATABLE_READ:可重复读,解决脏读、不可重复读,存在幻读。SERIALIZABLE:串行化,解决所有并发问题,性能最低。五、SpringMVC核心面试题17.SpringMVC的执行流程?完整执行流程(面试标准流程):客户端发起HTTP请求,请求到达DispatcherServlet前端控制器。DispatcherServlet调用HandlerMapping,根据URL匹配对应的Controller处理器。获取处理器适配器HandlerAdapter,执行目标Controller方法。Controller处理业务逻辑,返回ModelAndView。视图解析器ViewResolver解析视图。渲染视图,封装响应结果,返回给客户端。18.@RequestMapping、@GetMapping、@PostMapping区别?@RequestMapping:通用请求注解,不限制请求方式,Get、Post都可以接收,容易产生乱请求。@GetMapping:仅接收GET请求,用于查询接口。@PostMapping:仅接收POST请求,用于新增、修改接口。开发规范:查询用GET,写操作用POST,禁止全部使用RequestMapping。19.SpringMVC拦截器和过滤器的区别?过滤器Filter:属于Servlet规范,运行在Spring容器外,拦截所有请求,包括静态资源,优先级高。拦截器Interceptor:属于Spring框架,运行在Spring容器内,只拦截Controller请求,不拦截静态资源,可以获取Spring上下文、Bean,功能更灵活。日常接口权限、日志、token校验优先用拦截器。六、Spring实战常见坑点面试题20.单例Bean为什么不能用成员变量?SpringBean默认单例,整个容器只有一个对象。如果定义成员变量,多线程并发请求时,所有线程共享同一个变量,会出现线程安全问题、数据覆盖、数据错乱。解决方案:尽量用方法内局部变量,需要共享数据使用ThreadLocal隔离线程。21.@Autowired和@Resource区别?@Autowired:Spring注解,默认按类型装配,必须依赖对象存在,可配合@Qualifier按名称匹配。@Resource:JDK原生注解,默

温馨提示

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

评论

0/150

提交评论