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

下载本文档

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

文档简介

Spring+MyBatis高频面试题及详细答案(实战版)一、Spring核心面试题1.简单说说你对Spring框架的理解,核心作用是什么?Spring是一款轻量级的Java开发框架,核心目的是简化企业级开发,解决传统J2EE开发臃肿、耦合度高的问题。它不是替代任何框架,而是整合、管理各类组件,让项目开发更规范、更高效。Spring两大核心思想是IOC(控制反转)和AOP(面向切面编程):IOC颠覆了传统对象创建方式,原本开发者手动new对象、管理对象依赖,Spring会主动创建、组装、管理所有组件对象,统一放入IOC容器中,全程由容器控制对象生命周期和依赖关系,彻底解耦业务代码。AOP可以在不修改原有业务代码的前提下,对方法进行增强,适合处理通用公共逻辑,比如日志记录、事务控制、权限校验、性能监控等,实现业务逻辑与公共逻辑的分离。除此之外,Spring还提供了事务管理、资源整合、框架适配等能力,能无缝衔接MyBatis、Redis、MQ等主流技术,是Java后端开发的基础核心框架。2.什么是IOC?IOC的实现原理是什么?IOC全称控制反转,核心是将对象的创建、依赖注入、生命周期管理的控制权,从开发者代码转移到Spring容器。传统开发是主动创建对象、主动赋值依赖,属于正向控制;IOC是容器主动管理所有组件,开发者只需声明依赖,容器自动完成装配,实现了组件之间的低耦合。IOC核心实现原理:第一,资源解析。Spring启动时会扫描XML配置、注解标记的类,读取所有Bean的定义信息,包括类路径、作用域、依赖关系等。第二,Bean定义注册。将解析后的Bean信息统一存入BeanDefinition注册表,统一管理所有组件的定义规则。第三,实例化与初始化。容器根据Bean定义,通过反射机制创建对象,自动完成依赖注入,执行初始化方法,最终将完整对象存入单例池。第四,销毁管理。容器关闭时,统一执行Bean的销毁方法,完成资源释放。3.SpringBean的生命周期详细流程SpringBean的生命周期是从实例化到销毁的完整过程,单例Bean随容器启动创建、容器关闭销毁,多例Bean每次获取都会新建、使用后自动回收,完整流程如下:1.实例化:Spring根据Bean定义,通过反射调用类的无参构造方法,创建对象空实例,此时对象属性均为默认值。2.属性填充(依赖注入):容器自动扫描当前Bean的依赖属性,完成自动装配,赋值对应的依赖对象。3.前置处理:执行BeanPostProcessor的前置处理方法,对刚赋值完成的Bean进行自定义修改、增强。4.初始化:先执行InitializingBean的afterPropertiesSet方法,再执行自定义的init-method初始化方法。5.后置处理:执行BeanPostProcessor的后置处理方法,完成Bean的最终增强,代理对象的生成也在这一步。6.就绪使用:Bean完全初始化完成,存入单例池,可供业务代码正常调用。7.销毁:容器关闭时,执行DisposableBean的销毁方法和自定义destroy-method方法,释放资源。4.SpringBean的作用域有哪些?常用的是哪几个?Spring官方定义6种Bean作用域,实际开发中常用的只有2种:1.singleton(单例,默认):整个Spring容器中仅存在一个Bean实例,容器启动时初始化(非懒加载),全局共享。注意:单例Bean是非线程安全的,不能在Bean中定义成员变量存储业务数据。2.prototype(多例):每次从容器中获取Bean时,都会创建一个全新的实例,对象用完后由JVM垃圾回收,容器不管理多例Bean的销毁。其余四种为Web专属作用域,仅在Web项目中生效:request、session、application、websocket,日常开发极少使用。5.什么是AOP?AOP的应用场景和核心术语AOP面向切面编程,是一种横向扩展代码的编程思想,核心是在不改动原有业务代码的前提下,对方法进行拦截和增强,抽取通用重复逻辑统一管理。常用应用场景:接口日志打印、方法性能耗时统计、统一事务控制、权限拦截、参数校验、缓存处理、异常统一处理。AOP核心术语:1.连接点:可以被切面拦截的所有方法,项目中大部分业务方法都是连接点。2.切入点:从所有连接点中,通过表达式筛选出的需要真正拦截的方法。3.通知:切面中具体执行的增强逻辑,分为前置通知、后置通知、返回通知、异常通知、环绕通知。4.切面:切入点和通知的结合体,是封装通用增强逻辑的类。5.织入:将切面增强逻辑嵌入目标方法的过程,SpringAOP是运行时动态织入。6.SpringAOP的动态代理机制,JDK代理和CGLIB代理区别SpringAOP底层依靠动态代理实现方法增强,分为JDK动态代理和CGLIB动态代理两种:JDK动态代理:基于接口实现,只能代理实现了接口的类。底层通过反射生成接口的实现类,重写接口方法完成增强。优点是原生JDK支持、无需引入额外依赖;缺点是无接口的类无法代理。CGLIB动态代理:基于字节码操作,通过继承目标类生成子类作为代理对象,无需依赖接口,普通类、无接口类都能代理。缺点是无法代理被final修饰的类和方法,因为无法继承重写。Spring代理规则:Spring5.2之后默认统一使用CGLIB代理;低版本Spring中,目标类有接口则用JDK代理,无接口则用CGLIB代理。7.Spring事务的传播机制有哪些?常用场景?Spring事务传播机制用于解决多个事务方法嵌套调用时,事务如何传递、合并、隔离的问题,一共7种,重点掌握5个常用的:1.REQUIRED(默认):当前有事务就加入,没有就新建事务。最常用,适配绝大多数增删改业务。2.SUPPORTS:当前有事务就加入,没有就以非事务方式运行。适合查询类方法。3.MANDATORY:强制要求在事务内运行,没有事务直接报错。适合必须嵌套在主事务中的核心业务。4.REQUIRES_NEW:无论当前是否有事务,都新建一个独立事务,挂起原有事务。适合独立日志记录、异常备份业务,主事务回滚不影响该方法事务。5.NESTED:如果有事务,在当前事务的保存点运行,子事务独立回滚不影响主事务;无事务则新建事务。适合分支业务独立回滚场景。8.Spring事务失效的常见场景(高频坑点)实际开发中很多事务失效问题,核心原因是Spring事务基于AOP动态代理生效,只有外部调用代理对象的方法,事务才会触发,常见失效场景:1.方法访问权限非public:private、protected方法无法被AOP拦截,事务直接失效。2.内部调用本类方法:比如本类A方法调用本类带事务的B方法,不会走代理对象,事务失效。解决方案是通过Spring容器获取当前类代理对象调用。3.异常类型不匹配:默认事务只捕获RuntimeException和Error,普通CheckedException不会触发回滚,需要手动配置rollbackFor。4.异常被手动捕获:方法内部try-catch吃掉异常,代理无法感知异常,不会触发回滚。5.多线程调用事务方法:子线程无法继承主线程事务,事务独立,会失效。二、MyBatis核心面试题1.说说MyBatis的优势,和JDBC、Hibernate的区别MyBatis是一款半自动轻量级ORM持久层框架,核心作用是简化数据库操作,封装JDBC繁琐代码。对比原生JDBC:原生JDBC需要手动加载驱动、创建连接、编写statement、手动封装结果集、关闭资源,代码冗余极高。MyBatis自动完成资源加载、连接管理、结果集映射,大幅简化代码。对比Hibernate:Hibernate是全自动ORM框架,完全屏蔽SQL,开发效率高,但SQL可控性差,复杂查询、性能调优困难。MyBatis属于半自动,开发者手写SQL,灵活度高、便于优化,适配互联网高并发、复杂查询场景,这也是企业主流使用MyBatis的核心原因。MyBatis核心优势:SQL与代码分离、支持动态SQL、结果自动映射、性能损耗小、易于维护和调优。2.MyBatis的核心执行流程(完整流程)1.加载配置文件:项目启动加载mybatis全局配置文件、Mapper映射文件,解析所有配置信息。2.构建SqlSessionFactory:通过配置信息创建SqlSessionFactory工厂类,全局唯一,用于生产SqlSession。3.获取SqlSession:从工厂中获取SqlSession对象,SqlSession是数据库会话对象,包含数据库连接,负责执行SQL。4.获取Mapper代理对象:SqlSession根据Mapper接口生成动态代理对象,无需手动写Mapper实现类。5.执行SQL:代理对象调用接口方法,匹配对应的MapperSQL语句,MyBatis完成参数绑定、SQL解析、执行。6.结果映射封装:将数据库查询结果集,根据映射规则自动封装为Java对象。7.资源关闭:SqlSession关闭,释放数据库连接资源。3.MyBatis中#{}和${}的区别?各自使用场景?这是面试高频基础题,核心区别在于预编译、防注入、拼接规则:#{}:预编译占位符,底层是PreparedStatement。会自动对参数进行转义、加引号,有效防止SQL注入,安全性高。参数是动态赋值,SQL语句结构固定。日常动态参数查询、增删改参数全部使用#{}。${}:直接字符串拼接,底层是Statement。不会转义参数、不加引号,直接将参数拼入SQL,存在严重SQL注入风险。${}唯一使用场景:适用于动态表名、动态字段、排序字段等必须拼接SQL结构的场景,比如根据不同表名查询、动态排序。使用时必须手动校验参数,防止注入。总结:能用#{}绝不使用${},${}仅用于SQL结构动态拼接场景。4.MyBatis动态SQL常用标签及作用动态SQL是MyBatis核心特性,用于解决多条件动态查询、参数为空适配问题,常用标签:1.<if>:条件判断,参数非空时拼接对应SQL片段,最常用。2.<where>:自动处理查询条件的前缀and/or,自动去除多余前缀,避免语法错误。3.<set>:用于更新语句,自动去除最后一个多余逗号,适配动态字段更新。4.<foreach>:遍历集合,常用于in查询、批量新增、批量修改。5.<choose>、<when>、<otherwise>:类似switch-case逻辑,多条件互斥选择,只执行第一个满足条件的片段。6.<trim>:自定义字符串截取、拼接规则,可替代where、set标签,灵活性更高。5.MyBatis一级缓存和二级缓存的区别、失效场景MyBatis缓存用于减少重复查询数据库,提升查询性能,分为一级缓存和二级缓存:一级缓存(本地缓存)默认开启,无需手动配置,作用域为同一个SqlSession。同一会话中,相同查询SQL只会查一次数据库,后续直接读缓存。失效场景:SqlSession关闭、会话内执行增删改操作、手动清空缓存,一级缓存会立即失效。二级缓存(全局缓存)默认关闭,需要手动开启,作用域为同一个Mapper命名空间,跨SqlSession生效,全局共享缓存数据。生效条件:当前SqlSession关闭后,查询数据才会存入二级缓存;任意会话执行该Mapper的增删改,会清空该命名空间所有二级缓存。企业开发中一般很少开启二级缓存,多使用Redis等第三方缓存替代,二级缓存分布式场景下容易出现数据不一致问题。6.MyBatis结果映射:实体类属性和数据库字段不一致如何处理?开发中经常出现数据库字段下划线命名、实体类属性驼峰命名不一致的情况,两种解决方案:1.全局开启驼峰自动转换:在mybatis全局配置中开启mapUnderscoreToCamelCase=true,自动将数据库下划线字段映射为实体驼峰属性,适合全局统一规范场景,项目中最常用。2.自定义ResultMap映射:手动配置字段和属性的对应关系,灵活度高,适合字段名差异大、一对一、一对多复杂关联映射场景。7.MyBatis分页原理?为什么不推荐使用RowBounds分页?MyBatis自带RowBounds分页属于内存分页,执行原理是:先查询出所有符合条件的数据,存入内存,再根据offset、limit截取对应分页数据。缺点非常明显:数据量较大时,会一次性查询大量数据,占用数据库连接和内存,查询效率极低,极易引发性能问题,因此生产环境绝对不使用。企业主流方案:使用PageHelper分页插件,底层是物理分页,直接在SQL后拼接limit语句,只查询当前页数据,性能高效、使用便捷。8.MyBatis批量插入数据的方式及优缺点1.foreach循环单次插入:在Mapper中通过foreach拼接多条insert语句,一次性执行。优点是配置简单;缺点是数据量极大时SQL语句过长,容易超出数据库语句长度限制,性能一般。2.SqlSession批量模式:开启批量SqlSession,单次提交批量数据。底层基于JDBC批量处理,减少数据库交互次数,性能远高于foreach拼接,适合大批量数据插入,是生产环境首选方案。三、Spring+MyBatis整合高频面试题1.Spring如何整合MyBatis?核心流程是什么?日常开发中Spring完全接管MyBatis,无需手动创建SqlSessionFactory,核心整合流程:1.引入mybatis-spring整合依赖,适配Spring容器。2.Spring容器中注册SqlSessionFactoryBean,自动读取MyBatis配置、数据源信息,创建全局唯一的SqlSessionFactory。3.配置MapperScannerConfigurer,扫描指定包下的所有Mapper接口,自动生成代理对象,注入Spring容器。4.业务层直接通过@Autowired注入Mapper接口,即可调用数据库方法,全程无需手动管理SqlSession。2.Mapper接口和MapperXML文件的绑定原理1.项目启动时,扫描Mapper接口和对应的XML文件,通过全限定类名+方法名唯一绑定SQL语句。2.Mapper接口的全限定名必须和XML文件的namespace一致,接口方法名必须和XML中的i

温馨提示

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

评论

0/150

提交评论