```html
📅 更新日期:2024年5月 🌐 域名:www.kaoacca.cn
专注Java后端技术深度解析

Spring面试知识点总结:从入门到精通的全方位指南

在当前的Java后端开发领域,Spring框架无疑是占据统治地位的技术栈。无论是传统的单体应用,还是如今流行的微服务架构,Spring及其生态系统(如Spring Boot、Spring Cloud)都是构建企业级应用的首选。然而,对于求职者而言,Spring面试知识点总结往往是一道难以跨越的鸿沟。面试官不仅考察你对API的使用,更深入考察你对框架底层原理、设计模式以及性能优化的理解。

本页面旨在提供一份详尽的Spring面试知识点总结,涵盖Spring Core的IOC/AOP、Spring MVC的请求处理流程、Spring Boot的自动配置原理、Spring Cloud的微服务治理,以及分布式环境下常见的问题解决方案。通过结构化的梳理和深度的解析,帮助你建立完整的知识体系,从容应对各类技术面试。

⚡ 核心基础

深入理解IOC容器、Bean的生命周期、AOP的代理机制,掌握Spring的设计哲学。

⚙️ 自动配置

解析Spring Boot Starter机制,@Configuration与@Bean的底层实现,自定义Starter开发。

☁️ 微服务架构

服务注册发现、负载均衡、熔断降级、配置中心、链路追踪等Spring Cloud组件详解。

Spring Core 核心原理深度解析

1. IOC(控制反转)与 DI(依赖注入)的本质

Spring面试知识点总结中,IOC是最基础也是最重要的概念。IOC并非什么新技术,而是一种设计思想,即“控制权的转移”。在传统开发中,对象A依赖对象B,通常由A主动new B();而在Spring中,对象的创建和依赖关系的维护由Spring容器统一管理,对象只需被动接受容器注入的依赖。

DI是IOC的具体实现方式。Spring支持三种注入方式:

  • 构造器注入:推荐方式,保证依赖不可变,便于单元测试。
  • Setter注入:适用于可选依赖,但可能导致对象状态不一致。
  • 字段注入:使用@Autowired,代码简洁但隐藏依赖,不推荐用于核心业务。

2. Bean的生命周期

理解Bean的生命周期是回答Spring面试问题的关键。一个Bean从创建到销毁,经历了一系列复杂的过程:

① 实例化 Instantiation

Spring容器通过反射调用构造器创建Bean实例,此时Bean还是一个“裸体”对象。

② 属性填充 Populate

利用依赖注入填充Bean的属性,此时Bean拥有了依赖对象,但仍缺少其他配置。

③ 初始化 Initialization

执行Aware接口方法(如BeanNameAware)、BeanPostProcessor前置处理、@PostConstruct注解、InitializingBean接口、自定义init-method。

④ 使用 Usage

Bean处于可用状态,供应用程序调用。

⑤ 销毁 Destruction

容器关闭时,执行DisposableBean接口、@PreDestroy注解或自定义destroy-method。

3. AOP(面向切面编程)的实现原理

AOP是Spring的另一个核心支柱,主要用于实现事务管理、日志记录、权限控制等非业务逻辑的横切关注点。Spring AOP底层主要依赖动态代理实现:

  • JDK动态代理:基于接口,生成代理对象实现接口方法。要求目标类必须实现接口。
  • CGLIB代理:基于继承,生成目标类的子类。要求目标类不能是final的。Spring 4之后默认优先使用JDK动态代理,若目标类无接口则自动切换为CGLIB。

面试常问:为什么Spring AOP只能代理方法,不能代理字段?
因为AOP基于代理机制,代理的是方法调用。字段访问直接读取内存,不经过方法调用链,因此无法被拦截。

Spring Boot 自动配置原理与实战

1. 自动配置原理 (@SpringBootApplication)

Spring Boot的核心魅力在于“约定优于配置”,其背后是强大的自动配置机制。启动类上的@SpringBootApplication注解是一个组合注解,包含三个关键注解:

  1. @SpringBootConfiguration:标识当前类为配置类。
  2. @EnableAutoConfiguration:开启自动配置,核心入口。
  3. @ComponentScan:扫描当前包及其子包下的组件。

@EnableAutoConfiguration通过@Import引入AutoConfigurationImportSelector,该类会读取META-INF/spring.factories(Spring Boot 2.7+为META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports)文件中配置的所有自动配置类。通过@Conditional系列注解(如@ConditionalOnClass、@ConditionalOnMissingBean),根据classpath下的依赖和已存在的Bean来决定是否加载特定的配置。

2. 自定义Starter开发

在实际工作中,我们经常需要封装内部组件并共享给其他项目。开发自定义Starter的步骤如下:

1. 创建autoconfigure模块:
  • 编写ConfigurationProperties类绑定配置
  • 编写AutoConfiguration类,使用@Conditional注解
  • 在resources/META-INF/spring/下注册配置类
2. 创建starter模块:
  • 依赖autoconfigure模块
  • 提供pom依赖,方便其他项目引入

3. Spring Boot 内置Tomcat与嵌入式启动

Spring Boot内置Tomcat,通过EmbeddedWebServerFactoryCustomizer自动配置Tomcat参数(如端口、线程池)。启动时,SpringApplication.run()会创建ApplicationContext,并调用EmbeddedWebServerFactory创建并启动嵌入式Servlet容器,实现“开箱即用”。

Spring Cloud 微服务架构核心组件

服务注册与发现
服务调用与负载均衡
熔断与限流

Nacos vs Eureka

在Spring Cloud生态中,服务注册中心是微服务治理的基础。Nacos作为阿里开源的注册中心与配置中心,逐渐取代Eureka成为主流。

特性 Eureka Nacos Zookeeper
一致性协议 AP AP/CP切换 CP
健康检查 客户端心跳 心跳/主动检测 客户端心跳
配置中心 不支持 支持 不支持
语言支持 Java 多语言 多语言

Nacos核心优势:支持CP/AP模式切换,兼顾一致性要求高的场景(如DNS)和高可用场景(如服务发现);内置配置管理功能,减少组件依赖。

OpenFeign与LoadBalancer

服务间调用通常使用OpenFeign,它基于接口注解声明式调用,底层集成Ribbon(Spring Cloud 2020+后替换为Spring Cloud LoadBalancer)实现客户端负载均衡。

负载均衡策略:

  • RoundRobin:轮询,默认策略。
  • Random:随机。
  • Weighted:加权,根据实例健康度动态调整权重。

Feign优化点:连接池复用(如HttpClient/OkHttp)、日志级别配置(BASIC/HEADERS/FULL)、请求压缩、超时时间调整。

Sentinel vs Hystrix

Hystrix已停止维护,Sentinel成为主流熔断限流组件。Sentinel以“流量”为核心,提供丰富的应用场景:

  • 熔断降级:慢调用比例、异常比例、异常数。
  • 系统负载保护:根据系统Load1、CPU使用率等自动保护。
  • 热点参数限流:针对特定参数值进行限流。

Sentinel原理:基于滑动窗口统计实时指标,通过规则匹配决定是否放行请求。支持实时控制台动态推送规则,无需重启服务。

Spring 面试高频真题深度解答

Q1: Spring 如何解决循环依赖?

Spring通过三级缓存解决单例Bean的循环依赖:

  1. singletonObjects:存放完全初始化好的Bean。
  2. earlySingletonObjects:存放原始的Bean对象(尚未填充属性),用于解决循环依赖。
  3. singletonFactories:存放Bean工厂,用于生成早期引用(如处理AOP代理)。

流程:A依赖B,B依赖A。创建A时,将A的ObjectFactory放入三级缓存;填充属性时发现依赖B,创建B;B填充属性时发现依赖A,从三级缓存获取A的早期引用(若A有AOP,则通过Factory生成代理),放入二级缓存;B创建完成;A继续填充属性,完成创建。

注意:Spring无法解决构造器注入的循环依赖,只能解决Setter/字段注入。多例Bean(prototype)也不支持循环依赖。

Q2: Spring 事务失效的场景有哪些?

事务失效是面试高频陷阱,常见场景包括:

  • 方法非public:Spring事务默认只拦截public方法。
  • 自调用问题:同一类中A方法调用B方法,B的事务注解失效(因为绕过了代理)。
  • 异常被捕获:try-catch吞掉了异常,事务管理器未感知到异常。
  • 数据库引擎不支持:如MySQL MyISAM引擎不支持事务。
  • 传播行为配置错误:如REQUIRED但底层方法抛出非RuntimeException异常。

Q3: Spring MVC 请求处理流程?

请求到达DispatcherServlet → 查询HandlerMapping找到处理器 → 执行HandlerAdapter调用Controller → Controller返回ModelAndView → DispatcherServlet渲染视图 → 响应客户端。关键组件包括:DispatcherServlet、HandlerMapping、HandlerAdapter、ViewResolver。

```
斌知网
蜀ICP备2026017620号-5