Spring 高频面试题(实战向无机器感)_第1页
Spring 高频面试题(实战向无机器感)_第2页
Spring 高频面试题(实战向无机器感)_第3页
Spring 高频面试题(实战向无机器感)_第4页
Spring 高频面试题(实战向无机器感)_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

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

文档简介

Spring高频面试题(实战向无机器感)一、Spring基础核心面试题1.简单说说你对Spring框架的理解,它的核心作用是什么?Spring是一款轻量级的Java开发框架,核心目的是简化企业级Java开发,降低代码耦合度,让项目开发、维护、扩展更高效。它的核心两大思想是IOC(控制反转)和AOP(面向切面编程),在此基础上提供了事务管理、依赖注入、资源整合、框架整合等全套能力。日常开发中,Spring主要帮我们解决对象创建、依赖管理、通用功能统一管控的问题,避免开发者重复造轮子,同时规范代码结构。2.什么是IOC?控制反转具体反转了什么?IOC即控制反转,是Spring的核心设计思想。传统开发中,我们需要手动new对象、管理对象的依赖关系,对象的创建和控制权在开发者手中。而IOC把对象的创建、初始化、销毁、依赖装配的控制权,全部交给Spring容器管理,这就是「控制反转」——将开发者主动控制对象的权限,反转给了框架容器。IOC的底层实现核心是Bean工厂,容器启动时会扫描、创建、组装所有Bean,程序使用时直接获取即可,大幅降低了代码的耦合性。3.依赖注入(DI)有几种方式?日常开发常用哪种?依赖注入是IOC的具体实现手段,主要有三种方式:1.构造器注入:通过类的构造方法注入依赖对象;2.Setter方法注入:通过set方法给属性赋值注入依赖;3.字段注入:通过@Autowired、@Resource直接注解在属性上注入。日常开发中,Spring官方推荐构造器注入。优点很明显:可以保证对象初始化时依赖一定齐全,避免空指针问题,同时保证对象不可变,更利于单元测试和框架适配。字段注入虽然简洁,但容易导致类依赖混乱、循环依赖隐蔽等问题。4.@Autowired和@Resource的区别是什么?这是开发和面试高频对比点,核心区别集中在三点:1.来源不同:@Autowired是Spring专属注解,@Resource是Java原生JSR规范注解;2.匹配规则不同:@Autowired默认按类型装配,@Resource默认按名称装配,找不到名称再按类型;3.必填属性不同:@Autowired默认要求依赖对象必须存在,否则报错,可通过required=false关闭限制;@Resource没有强制必填限制。补充:如果项目需要兼顾通用性、脱离Spring框架也能运行,优先用@Resource;日常Spring项目开发,大多使用@Autowired。二、SpringBean核心面试题1.说说SpringBean的完整生命周期SpringBean从创建到销毁的完整流程非常固定,面试按步骤说清晰即可:1.实例化:Spring容器扫描Bean定义,通过反射创建Bean实例;2.属性填充:完成依赖注入,给Bean的属性赋值;3.初始化前置处理:执行BeanPostProcessor的前置处理方法;4.初始化方法执行:先执行InitializingBean的afterPropertiesSet方法,再执行自定义init-method方法;5.初始化后置处理:执行BeanPostProcessor的后置处理方法,完成Bean增强(AOP代理在此步骤生成);6.就绪使用:Bean完成初始化,放入单例池,可供业务调用;7.销毁:容器关闭时,执行DisposableBean的destroy方法和自定义destroy-method方法。2.SpringBean的作用域有哪些?默认是什么?Spring提供6种Bean作用域,开发常用的只有2种:1.singleton(单例):默认作用域,整个Spring容器中只创建一个Bean实例,全局共享;2.prototype(多例):每次从容器获取Bean都会创建一个新实例;3.request、session、application、websocket:仅Web环境生效,适配web生命周期。重点注意:单例Bean是容器单例,不是JVM单例,仅在当前Spring容器中唯一。3.单例Bean线程安全吗?为什么?怎么解决?不安全。Spring单例Bean全局共享,所有请求线程共用同一个Bean实例。如果Bean中存在成员变量,多线程同时读写该变量时,就会出现线程安全问题。解决方式:1.尽量保证Bean无状态,不定义可变成员变量,这是最常用、最优的方案;2.若必须使用可变变量,将变量放入ThreadLocal,实现线程隔离;3.必要时将Bean改为多例作用域,但会增加对象创建开销,不推荐滥用。4.Spring循环依赖是什么?怎么解决的?循环依赖就是两个或多个Bean互相依赖对方,比如A依赖B,B又依赖A,容器启动时会出现依赖嵌套无法初始化的问题。Spring能解决单例模式下、Setter/字段注入的循环依赖,无法解决构造器注入的循环依赖。核心解决方案是三级缓存:1.一级缓存:存放完全初始化好的单例Bean;2.二级缓存:存放原始Bean对象(已实例化、未填充属性);3.三级缓存:存放Bean的工厂对象,用于提前暴露未完成初始化的Bean引用。原理简单说:Bean实例化后提前将自己的引用放入三级缓存,对方依赖时可以直接获取引用,完成属性填充,后续再完成完整初始化,打破循环阻塞。三、SpringAOP面试高频题1.什么是AOP?核心应用场景有哪些?AOP即面向切面编程,是一种横向扩展代码的思想,能在不修改原有业务代码的前提下,对方法进行增强,实现业务逻辑与通用逻辑的解耦。日常开发核心场景:统一日志记录、权限校验、事务控制、接口限流、性能监控、异常统一处理等。2.AOP的核心术语你怎么理解?(切面、切点、通知、连接点)1.连接点:可以被增强的所有方法,是候选点位;2.切点:真正被选中、执行增强逻辑的连接点,通过表达式匹配;3.通知:具体的增强逻辑,分为前置、后置、返回后、异常、环绕通知;4.切面:切点和通知的结合体,包含要拦截的方法和对应的增强逻辑。3.SpringAOP的动态代理有几种方式?区别是什么?SpringAOP默认自动适配两种代理方式:1.JDK动态代理:基于接口实现,目标类必须实现接口,代理对象和目标对象实现同一个接口;2.CGLIB代理:基于子类继承实现,无需接口,通过继承目标类生成子类作为代理对象。核心区别:JDK代理只能代理接口方法,无法代理类;CGLIB可以代理普通类,覆盖类中所有可重写方法。Spring现在版本默认优先使用CGLIB代理。4.AOP环绕通知和其他通知的区别?前置、后置、返回、异常通知都是被动触发,只能在固定点位执行逻辑,无法控制目标方法的执行。而环绕通知功能最强,可以手动控制目标方法是否执行、执行前后的逻辑、捕获异常、修改返回值,是开发中最常用的通知类型,几乎可以替代其他所有通知。四、Spring事务面试核心题1.Spring事务的实现原理是什么?Spring事务基于AOP动态代理实现。当我们给方法添加@Transactional注解后,Spring会为该类生成代理对象。调用方法时,代理对象会先开启事务,执行目标业务逻辑,若无异常则提交事务,出现异常则回滚事务,全程无需手动编写事务开启、提交、回滚代码。2.Spring事务的传播属性有哪些?常用的几种区别?Spring一共有7种事务传播属性,面试重点掌握5个常用的:1.REQUIRED(默认):有事务就加入,没有就新建事务;最常用;2.SUPPORTS:有事务就加入,没有就非事务运行;3.MANDATORY:必须在事务内运行,无事务直接报错;4.REQUIRES_NEW:无论是否有当前事务,都新建一个独立事务,旧事务挂起;5.NESTED:嵌套事务,有父事务则作为子事务,父事务回滚子事务必回滚,子事务回滚不影响父事务。3.@Transactional事务失效的场景有哪些?(高频必考)这是面试超级高频问题,核心失效场景如下:1.方法非public修饰:SpringAOP只能拦截public方法,非public无法生成代理,事务失效;2.内部调用:同类中A方法调用本类带事务的B方法,不会走代理,事务失效;3.异常类型不匹配:默认只回滚运行时异常,捕获普通Exception或自定义异常未配置回滚,事务不回滚;4.方法被final/static修饰:无法被代理重写,事务失效;5.数据库不支持事务:比如MySQL使用MyISAM引擎,本身无事务能力;6.手动捕获异常未抛出:方法内try-catch捕获所有异常,代理感知不到异常,不会回滚。4.事务的隔离级别有哪些?解决了什么问题?数据库三大并发问题:脏读、不可重复读、幻读。Spring对应5种隔离级别:1.READ_UNCOMMITTED:读未提交,无法解决任何并发问题;2.READ_COMMITTED:读已提交,解决脏读,存在不可重复读、幻读(Oracle默认);3.REPEATABLE_READ:可重复读,解决脏读、不可重复读,存在幻读(MySQL默认);4.SERIALIZABLE:串行化,解决所有并发问题,性能最低;5.DEFAULT:跟随数据库默认隔离级别。五、Spring进阶实战面试题1.Spring中BeanFactory和ApplicationContext的区别?1.BeanFactory:Spring顶层容器接口,是最基础的IOC容器,采用延迟加载,只有获取Bean时才会创建,占用资源少,功能简单;2.ApplicationContext:BeanFactory的子接口,是实际开发使用的容器,采用立即加载,容器启动就初始化所有单例Bean,额外提供了国际化、事件发布、资源加载、容器监听等丰富功能。2.Spring事件机制的理解和使用场景Spring事件是典型的观察者模式,核心分为事件、事件发布者、事件监听者三部分。通过事件机制可以实现业务解耦,比如完成核心业务后,发布事件异步执行后续非核心逻辑。常见场景:用户注册成功后,发布事件完成发送短信、积分

温馨提示

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

评论

0/150

提交评论