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从创建到销毁,经历了一系列复杂的过程:
Spring容器通过反射调用构造器创建Bean实例,此时Bean还是一个“裸体”对象。
利用依赖注入填充Bean的属性,此时Bean拥有了依赖对象,但仍缺少其他配置。
执行Aware接口方法(如BeanNameAware)、BeanPostProcessor前置处理、@PostConstruct注解、InitializingBean接口、自定义init-method。
Bean处于可用状态,供应用程序调用。
容器关闭时,执行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注解是一个组合注解,包含三个关键注解:
- @SpringBootConfiguration:标识当前类为配置类。
- @EnableAutoConfiguration:开启自动配置,核心入口。
- @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的循环依赖:
- singletonObjects:存放完全初始化好的Bean。
- earlySingletonObjects:存放原始的Bean对象(尚未填充属性),用于解决循环依赖。
- 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。