
这篇文章按照 SpringBoot 面试高频题整理从 Spring 核心架构出发围绕 IOC、AOP、Bean 管理、事务机制、自动装配、MVC 请求流程、设计模式以及启动流程等核心模块展开。目标不是简单背诵注解和源码而是理解 SpringBoot 背后的运行机制能够用清晰的逻辑回答面试中常见的原理问题。IOC和AOPIOCIOC即控制反转指的是将对象的控制权交给 Spring 容器容器负责创建和管理对象我们只需要接受容器注入的对象。优点降低耦合在非 IOC 的传统编程中对象的创建和依赖管理硬编码在业务逻辑中与具体实现类强绑定一旦更换实现类就需要改动业务代码。不需要重复创建相同的对象浪费内存Spring 容器中的 Bean 对象默认是单例的。AOPAOP即面向切面编程用作无侵入式的代码增强一般对公共的行为或者逻辑进行抽取将横切逻辑和业务逻辑分离提升代码复用性和可维护性。应用场景权限验证记录操作日志Spring事务的实现即AOP实现方式动态代理JDK动态代理基于接口生成接口的代理类CGLIB代理基于类通过继承目标类生成字类重写方法增强Spring AOP 根据目标对象是否实现接口选择不同的代理机制实现了接口使用 JDK 动态代理。未实现接口使用 CGLIB 代理。常见注解SpringSpring MVCSpring Boot定位核心框架Web模块快速开发工具作用管理对象、事务、AOP处理HTTP请求简化Spring配置是否能单独用可以依赖Spring基于Spring解决问题企业开发基础Web接口开发快速启动项目包含关系基础Spring的一部分基于SpringSpring事务主要分为编程式事务和声明式事务两种编程式事务基于底层的 API如 platform transition manager、transition definition 等核心接口开发者完全可以通过编程的方式来进行事务管理。编程式事务方式需要手动管理事务的开启、提交、回滚等操作。声明式事务Spring ⽀持声明式事务管理即Transactional注解声明式事务管理建⽴在AOP之上。其本质是通过AOP功能对加了Transactional注解的⽅法前后进⾏拦截在执⾏⽬标⽅法之前开启事务在执⾏完⽬标⽅法之后根据执⾏情况提交事务或者回滚事务。声明式事务的优点声明式事务帮助我们节省了很多嗲吗自动帮我们进行事务的开启提交以及回滚等操作。声明式事务管理使用了AOP实现的本质就是在目标方法执行前后进行拦截。在目标方法执行前加入或创建一个事务在执行方法执行后根据情况选择提交或是回滚事务。使⽤这种⽅式对代码没有侵⼊性⽅法内只需要写业务逻辑就可以了。Spring Bean的作用域Single单例作用域每一次从 IOC 容器获取指定 Bean 对象时都会返回同一个实例对象。适用场景无状态 Bean如工具类、配置类、服务类等。Prototype原型作用域每一次从 IOC 容器获取指定 Bean 对象时都会返回一个新的实例对象。适用场景有状态Bean需要隔离状态的场景。但在基于 Spring 框架下的 Web 应用中增加了三种作用域Request 请求作用域针对每一次 HTTP 请求都会创建一个新的 bean。Session 会话作用域针对 session 会话同一个 session 共享同一个 bean 实例不同的 session 则产生不同的 bean 实例。Application 应用作用域整个 web 应用中共享一个实例。SpringBoot自动装配原理Spring Boot 自动配置的核心就是 EnableAutoConfiguration 注解。它通过 Import 引入了 AutoConfigurationImportSelector 类会去扫描 classpath 下所有 jar 包里的文件找出里面声明的自动配置类然后根据条件注解决定哪些配置要加载。整个流程是这样的Spring Boot 启动时SpringBootApplication 里包含的 EnableAutoConfiguration 生效。触发 AutoConfigurationImportSelector 去读取 factories 文件拿到一堆候选配置类。逐个检查这些类上的条件注解只有条件注解全部满足的配置类才会真正地加载并注册到容器里。Spring MVC执行流程Spring MVC 是 Spring 框架中专门用来做 Web 开发的模块核心思想是 MVC 分层Model 负责数据、View 负责展示、Controller 负责接收请求和协调。它最大的价值在于引入了一个前端控制器DispatcherServlet所有请求都先经过它由它来调度后续流程。以前用纯 Servlet 开发每个 URL都得写一个Servlet类几十个接口就是几十个类web.xml配置一大坨。有了DispatcherServlet后只需要在方法上加个RequestMapping 注解就能搞定URL映射代码量直接砍掉80%。Spring MVC 的分层是这样的1 Controller 层接收 HTTP 请求调用 Service 处理业务把结果返回给视图或直接返回JSON2Service 层处理业务逻辑事务控制一般也在这层3) Repository/DAO层跟数据库打交道执行 SQL4) View层渲染页面可以是JSP、Thymeleaf或者现在流行的前后端分离直接返回JSON用户发出请求到前端控制器前端控制器收到请求调用处理器引射器处理器引射器找到具体的处理器返回处理器执行链包括处理器和拦截器给前端控制器前端控制器调用处理器适配器处理器适配器靖哥哥适配器调用具体的处理器在方法上添加了ResponseBody因此通过HttpMessageConverter来返回结果转换为JSON并响应Spring中的设计模式面试官问了解那些设计模式时可以说Spring的源码其中用了什么设计模式单例模式默认情况Spring IOC容器中会确保每一个Bean只有一个实例该实例在整个应用中被共享使用好处对象复用避免频繁创建和销毁对象的开销减少内存占用和GC压力实现原理在Spring容器启动时会创建非懒加载的Bean并且将其存入缓存中后续对Bean的请求会从缓存ConcurrentHashMap中获取。工厂模式Spring IOC 容器就像是一个工厂封装了创建对象的细节。我们通过 getBean 方法从工厂中获取对象其好处在于解除了耦合实现了对象的创建和使用分离。集中管理对象的生命周期。代理模式Spring AOP面向切面编程使用了代理模式。当配置了一个切面Spring 会创建目标对象的代理拦截对应的方法调用在方法执行前后进行增强。其好处是无侵入式代码增强。责任链模式一个请求过程中可嫩几个过很多拦截器每个拦截器做的事情不一样这就是责任链SpringMVC通过责任来拿模式将请求处理流程拆解为多个可插拔的拦截器节点好处可以灵活的拓展处理流程若将所有拦截逻辑硬编码在单一处理流程中会导致代码臃肿那一维护而责任来拿每个节点只需要关注自己的职责。观察者模式观察者模式也称为发布-订阅模式Spring 中也有对应的机制 事件发布-监听机制存在着⼀对多的关系多个观察者监听(订阅)某个事件当这个事件被发布时多个观察者就能监听到进⽽去做观察者的逻辑好处使⽤该机制可以将相互耦合的代码解耦从⽽⽅便功能的拓展和调整。主逻辑只需要执⾏关键路径附带的(不断扩展的)操作可以由观察者监听事件发布后完成SpringBoot启动流程入口启动初始化配置执行main方法调用SpringApplication,run加载spring.factories中配置的初始化器和监听器创建应用程序上下文创建Bean工厂对象刷新应用程序上下文核心方法refresh配置工厂对象上下文类加载器对象发布处理器注册并实例化bean工厂发布处理器并且调用这些处理器对包扫描注册并实例化bean发布处理器初始化一些上下文实例化所有bean工厂缓存的bean对象发布通知-上下文刷新完成启动tomcat服务器启动完成发布ApplicationReadyEvent 事件通知监听者启动程序已完成。