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

下载本文档

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

文档简介

IOC、AOP高频面试题及详细答案(实战版)一、IOC相关面试题1.什么是IOC?控制反转具体反转了什么?IOC就是控制反转,是Spring的核心思想之一。简单说就是把对象的创建、依赖管理、生命周期控制权,从代码业务层交给Spring容器。传统开发中,我们需要依赖某个类时,都是自己new对象,对象的创建、销毁、依赖赋值都由开发者代码主动控制。而IOC模式下,我们只需要声明依赖,不用手动创建对象,所有对象都由Spring容器统一实例化、装配、管理。反转的核心:控制权反转。从「程序员主动创建对象」变成「容器主动注入对象,程序被动接收」。2.什么是DI?DI和IOC的关系是什么?DI是依赖注入,是实现IOC思想的具体手段。IOC是设计思想、理论原则,DI是落地实现方式。简单理解:IOC是目的,DI是手段。想要实现控制权反转,核心就是通过依赖注入完成对象依赖的自动装配。依赖注入就是容器主动把当前类需要的依赖对象,自动赋值给当前类,彻底消除代码中的硬编码new对象。3.Spring中有几种依赖注入方式?各自优缺点?主流三种注入方式:构造器注入、setter方法注入、字段注入(@Autowired)1)构造器注入(官方推荐)在类的构造方法中传入依赖对象,Spring实例化对象时自动通过构造方法注入依赖。优点:可以保证对象初始化完成后,所有依赖全部就绪,不会出现空指针;保证依赖不可变,线程安全;适配Spring循环依赖校验规则。缺点:依赖过多时构造方法会臃肿,可读性变差。2)Setter方法注入通过setXxx方法完成依赖注入。优点:适合可选依赖,不是必须的依赖可以不注入;对象创建后可以动态修改依赖。缺点:无法保证对象初始化后依赖齐全,可能存在依赖缺失导致空指针。3)字段注入(日常开发常用)直接在属性上加@Autowired注解注入。优点:代码简洁、开发效率高,不用写冗余构造和set方法。缺点:违背单一职责,容易造成类依赖泛滥;隐藏依赖关系,可读性差;容易出现循环依赖问题,单元测试不方便。4.SpringIOC容器的初始化流程是什么?核心流程分六大步,面试常用精简版:1.资源加载解析:读取配置文件、注解、JavaConfig配置,扫描所有带注解的Bean,生成Bean定义信息(BeanDefinition)。2.注册Bean定义:把扫描到的Bean信息存入BeanDefinition注册表,此时还没有创建对象,只是存储类的元数据。3.Bean实例化:容器启动后,根据Bean定义,通过反射创建Bean实例(单例非懒加载Bean启动即创建)。4.依赖填充:自动完成依赖注入,处理循环依赖、属性赋值。5.Bean初始化:执行前置处理器、初始化方法(@PostConstruct、init-method)、后置处理器。6.Bean销毁:容器关闭时,执行销毁方法(@PreDestroy、destroy-method)。5.Spring的Bean作用域有哪些?常用的是哪个?Spring内置6种作用域,面试重点记4个核心:1.singleton(默认):单例,整个IOC容器中只存在一个Bean实例,容器启动时创建(非懒加载),全局共享。2.prototype:多例,每次从容器获取Bean都会新建一个实例,容器只负责创建,不负责销毁。3.request:每次HTTP请求创建一个新Bean,请求结束销毁。4.session:每个用户会话对应一个Bean,会话失效销毁。日常开发99%用singleton,单例Bean能减少对象创建开销,提升性能。6.单例Bean是线程安全的吗?为什么?怎么解决?不是线程安全的。Spring单例是容器级单例,整个容器只有一个对象实例,所有请求线程共享这一个Bean。如果Bean中存在成员变量、共享可变数据,多线程并发修改时就会出现线程安全问题。解决方式:1.尽量保证Bean无状态,不定义可变成员变量;2.用ThreadLocal存储线程私有变量;3.必要时改用prototype多例作用域;4.加锁控制并发修改。7.Spring如何解决循环依赖?哪些情况解决不了?循环依赖:A依赖B,B又依赖A,互相嵌套依赖。Spring核心解决方案:三级缓存+提前暴露对象三级缓存分别是:1.一级缓存:存放完整初始化完成的单例Bean;2.二级缓存:存放实例化完成、但还未初始化的Bean对象;3.三级缓存:存放Bean的工厂对象,用于提前暴露实例。执行逻辑:Bean实例化后,先把自己放入三级缓存,提前暴露引用,后续依赖注入时,其他Bean可以直接拿到未初始化完成的对象,解决循环引用问题。无法解决的场景:1.构造器注入的循环依赖(启动直接报错,无法解决);2.多例Bean的循环依赖;3.带有AOP代理的复杂循环依赖(极少数场景报错)。二、AOP相关面试题1.什么是AOP?核心作用是什么?AOP是面向切面编程,是一种横向扩展代码的编程思想。简单说:在不修改原有业务代码的前提下,对方法进行增强、拦截、扩展功能。核心作用就是解耦,把业务代码和通用公共代码拆分。比如日志、事务、权限校验、限流、监控、异常统计这些通用功能,不用写在每个业务方法里,统一通过切面实现。2.AOP核心术语有哪些?详细解释1.切面(Aspect):封装所有通用增强逻辑的类,也就是我们写的切面类。2.连接点(JoinPoint):可以被切面拦截的所有方法,程序中所有可增强的方法都是连接点。3.切入点(Pointcut):从所有连接点中,筛选出来需要真正拦截的方法,通过表达式匹配。4.通知(Advice):切面具体执行的增强逻辑,分为前置、后置、环绕、异常、最终通知。5.目标对象(Target):被切面拦截、增强的原始业务对象。6.代理对象(Proxy):AOP生成的代理对象,用来替代目标对象执行方法,完成增强。3.AOP有几种通知类型?执行顺序是什么?一共5种通知类型:1.@Before前置通知:目标方法执行前执行;2.@AfterReturning后置正常返回通知:方法正常执行完毕、无异常时执行;3.@AfterThrowing异常通知:方法抛出异常时执行;4.@After最终通知:无论方法正常结束还是报错,都会执行,类似finally;5.@Around环绕通知:包裹目标方法,可手动控制方法执行、前后增强、捕获异常,功能最强。正常执行顺序:环绕前置→前置通知→目标方法执行→环绕后置→后置返回通知→最终通知异常执行顺序:环绕前置→前置通知→目标方法报错→异常通知→最终通知4.SpringAOP的两种动态代理方式?区别是什么?SpringAOP底层只用两种代理:JDK动态代理、CGLIB代理。1.JDK动态代理基于接口实现,只能代理实现了接口的类,原生JDK自带,无需额外依赖。缺点:没有接口的类无法使用JDK代理。2.CGLIB代理基于字节码生成子类实现,无需接口,直接对类进行代理,通过继承目标类重写方法完成增强。缺点:无法代理final类和final方法,因为不能被继承重写。Spring选择规则:1.目标类有接口,默认使用JDK代理;2.目标类无接口,自动使用CGLIB;3.SpringBoot2.0之后,默认统一使用CGLIB代理。5.为什么AOP不能拦截private、static、final方法?1.private方法:权限私有,无法被子类重写,代理无法覆盖增强;且私有方法不会被外部调用,不属于Spring代理调用链路。2.static方法:属于类不属于对象,代理是对象级别的增强,无法拦截静态方法。3.final方法:无法被重写,CGLIB基于子类重写实现增强,所以无法拦截。6.AOP的常见应用场景?项目中怎么用的?都是实际开发高频场景,面试直接说实战即可:1.统一日志处理:通过切面拦截所有接口,自动记录请求参数、响应结果、耗时、请求地址,不用每个接口手写日志。2.事务管理:Spring声明式事务@Transactional底层就是AOP,方法执行前开启事务,正常结束提交,异常回滚。3.权限校验:拦截接口,校验用户登录状态、角色权限,无权限直接拦截返回。4.接口限流、防重复提交:通过切面拦截请求,基于Redis实现短时间重复请求拦截。5.性能监控:统计每个接口、方法的执行耗时,排查慢接口。6.统一异常处理、数据脱敏:方法返回结果前,自动脱敏手机号、身份证。7.AOP失效的常见场景?面试高频坑点1.同类内方法调用导致失效:同一个类中,A方法直接调用本类B切面方法,不会触发切面。因为是原生对象调用,不是代理对象调用。解决方式:通过上下文获取代理对象调用。2.方法权限问题:private、static、final方法无法被拦截。3.切入点表达式书写错误:匹配不到目标方法,切面不生效。4.切面类没有交给Spring管理:切面类没加@Aspect+@Component,容器无法识别切面。5.多切面优先级冲突:未设置order优先级,切面执行顺序错乱,导致功能异常。三、IOC&AOP综合面试题1.IOC和AOP的核心区别?1.IOC是基础容器,负责对象创建、依赖管理、解耦对象之间的依赖关系,是Spring整个框架的底层基础。2.AOP是功能扩展,基于IOC容器实现,在不修改业务代码的前提下,横向增强方法功能,解

温馨提示

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

最新文档

评论

0/150

提交评论