
如果有人问我学Java后端最该先搞懂什么我大概率会脱口而出——Spring。这个框架从2002年诞生到现在二十多年过去了依然是Java服务端的事实标准。不管你是刚入职的新人还是正在准备面试的候选人哪怕你做的项目用的是其他语言只要圈子跟Java沾边Spring这关就绕不过去。这篇是Spring详解系列的第一篇只讲一件事把Spring的版图给你画清楚。包括它到底解决什么问题、生态里各个成员都是干嘛的、核心的IoC和AOP思想应该怎么理解、一个Spring程序启动后内部发生了什么、以及新手最容易困惑的几个点。内容会尽量贴近实战不堆概念毕竟框架这东西理解思想比背定义重要一百倍。1. 先聊清楚Spring到底是什么很多教程一上来就甩定义“Spring是一个轻量级的Java企业级应用开发框架。”这句话没毛病但对新手来说约等于没说。什么叫轻量级什么叫企业级为什么Java项目非要它不可我换个说法你感受一下。1.1 Java后端开发里Spring到底在管哪摊事写后端程序核心就三件事创建对象、让对象之间互相协作、在合适的时机处理业务逻辑。听起来简单但如果项目稍微复杂一点问题就来了。你有一个订单服务它要调用库存服务、还要发通知、还要写日志。传统写法是直接在类里面new出来public class OrderService { private InventoryService inventoryService new InventoryService(); private NotifyService notifyService new NotifyService(); private LogService logService new LogService(); }这样写有什么问题第一耦合太紧。如果InventoryService的构造方法改了所有new它的地方都要跟着改。第二测试困难。你想单独测OrderService结果它把一堆真实依赖全拉进来了mock都无从下手。第三对象生命周期没人管。谁创建、谁销毁、是不是单例全靠写代码的人自觉。Spring Framework的核心容器就是来解决这三件事的。它把你代码里那些“创建对象、维护依赖关系”的活儿接了过去你的类只需要声明“我需要什么”容器在启动时负责把对应实例给你准备好、送过来。这也是我一直跟新人强调的Spring的底色不是花哨的技术而是“对象管理”四个字。1.2 在聊Spring之前得先理解J2EE那笔“烂账”Spring之所以出现很大程度上是因为早期的Java企业级开发J2EE/EJB时代实在太痛苦了。那时候写一个业务组件可能要继承一堆容器接口部署到专门的EJB容器里才能运行干个屁大点的事都臃肿得吓人。代码跟容器绑死想单元测试难如登天。后来Rod Johnson写了那本有名的书核心观点就一句话企业级开发不应当这么重轻量级、可测试、不侵入业务的方案才是出路。Spring顺着这个思路诞生用最朴素的“配置文件普通Java对象”取代了复杂的EJB体系让代码回归平凡同时还能享受到事务、安全这类企业级能力。这段历史不是让你背年份而是帮你理解Spring设计上的一个核心取向**让业务代码尽量干净把通用能力下沉到框架层。**后面你学Spring Boot、学Spring Cloud会发现它们全都传承了这个基因。2. 从Framework到全家桶Spring生态版图现在你打开Spring官网会发现项目一大堆Framework、Boot、Cloud、Security、Data、AI……很多新手会懵我学的到底是哪个Spring这里我把成员捋一遍你就知道全局了。2.1 Spring Framework一切的地基Spring Framework是整个生态的底盘常被直接叫作Spring或者Spring Core。它提供的东西主要包括IoC容器管理对象、AOP面向切面编程、数据访问抽象、Spring MVCWeb层框架等等。你可以把它理解成一套“通用能力工具箱”。后面所有Spring家族成员本质上都是在它上面做了更高层的封装。2.2 Spring Boot把地基盖成精装房Spring Framework好用是好用但早期的配置是真的繁琐。你要写一堆XML、配数据源、配事务管理器、配视图解析器……项目还没写几行业务代码光配置就几百行了。Spring Boot的出现彻底改变了这个局面它抱持“约定大于配置”的理念把大量常用配置变成自动默认值。你引入一个spring-boot-starter-web依赖一个main方法启动起来内嵌Tomcat直接就跑了不需要部署WAR包也不需要手工搭环境。注意Spring Boot不是一个功能框架它更像一个加速器、一套脚手架。你Boot里用的IoC、AOP、MVC底层全是Spring Framework在干活。2.3 Spring Cloud与Spring AI往上再长Spring Cloud是一组微服务解决方案的集合包括服务注册与发现Nacos、Eureka、配置中心、网关、熔断限流等组件让多个服务能组成一个分布式系统协同工作。Spring AI则是近两年火起来的新方向目标是让Java应用能方便地接入大模型能力比如聊天补全、Agent对话、向量检索等。你看热词里面“Spring AI 2.0 连接百炼 qwen3.7”这种就是非常典型的实践。我用一张表把这几个最容易混淆的项目给你排开项目定位一句话用途典型场景Spring Framework基座提供IoC容器、AOP、事务、MVC等基础能力所有Java后端项目的底层Spring Boot脚手架自动配置、内嵌服务器、快速启动快速搭建独立服务开箱即用Spring Cloud微服务套件服务治理、配置管理、网关、限流多服务分布式系统的治理Spring Security安全框架认证与授权登录、权限控制Spring Data数据访问抽象统一访问关系型/非关系型数据库大幅简化数据层代码Spring AIAI集成框架对接大模型与Agent能力AI应用、ChatBot、内容生成这样看是不是清晰很多学习的时候也建议按这个顺序来先把Framework的IoC和AOP吃透再上Boot后面按项目需求整Cloud、Security、AI。3. 核心思想拆解IoC/DI到底改变了什么如果说Spring只能留一个概念那一定是控制反转IoC。这也是面试必问、实战必用的东西。我把它掰开了讲。3.1 控制反转把“拿对象”的权力交出去控制反转英文Inversion of Control简称IoC。听名字很抽象实际上就一句话对象的创建和管理权力从程序员手里反转给容器。传统模式下代码想要什么依赖自己new一个控制权在自己手里。IoC模式下你的类只负责声明“我需要什么”容器在背后帮你创建、组装、注入。控制权从“代码主动创建”变成了“容器主动提供”这就是反转。我用点餐来类比传统做法是你想吃饭得自己买菜、洗菜、炒菜一切自己控制IoC做法是你走进餐厅跟服务员说“我要一份宫保鸡丁”后厨做好给你端上来。你不关心鸡是哪来的、花生米怎么炸的你只管点菜和吃。Spring容器就是那个后厨你的对象声明就是点菜。3.2 依赖注入三种注入方式怎么选依赖注入DI是IoC的一种实现方式具体手段有几种构造器注入通过构造函数传参注入依赖。Setter注入通过setter方法注入。字段注入直接在成员变量上加Autowired最常见也最“懒”。我的建议很简单**能构造器注入就别用字段注入。**构造器注入的好处是依赖在对象创建那一刻就是完整的、不可变的而且一眼能看出这个类需要哪些依赖。字段注入虽然写起来爽但容易产生隐藏依赖测试也不好mock。部分老项目大量用字段注入维护起来真的很酸爽。3.3 AOP把横切逻辑从业务里抽出来另一个核心是AOP面向切面编程。它处理的是一类特殊问题日志、事务、权限校验、性能监控这些逻辑几乎每个业务方法都要用但它们又跟核心业务无关。如果每个方法里都手动写一遍日志和事务代码会膨胀漏写一个地方就是事故。AOP的思路是把这些横切关注点抽取出来通过动态代理在目标方法执行前、后、异常时插入逻辑。你不需要改业务代码就能给一批方法统一加上这些能力。后面你要学Spring事务管理本质就是AOP的典型应用。可能有人听到动态代理就打怵。其实不需要往深了钻你只要理解Spring在运行时通过代理对象把方法调用给“拦截”了拦截前后交给切面逻辑处理。后续系列讲到AOP源码时再慢慢拆那层代理怎么生成的。4. 一个Spring程序是怎么跑起来的知其然还要知其所以然。很多人学Spring敲了一堆注解和配置代码能跑但不知道启动那一刻发生了什么。我从Spring Boot的启动讲起把主干流程给你走一遍。4.1 启动过程的几个关键阶段拿一个最简单的Spring Boot应用来说入口就是一个main方法SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }这一行run背后做的事情大致可以拆成几个阶段启动内嵌Web服务器Tomcat等准备接收HTTP请求。加载配置读取application.yml、环境变量、命令行参数合成最终配置。创建IoC容器AnnotationConfigApplicationContext扫描启动类所在包及子包下的所有标注了Component、Service、Repository、Controller的类。对这些类进行Bean定义注册、依赖分析、实例化、属性填充和初始化。执行Spring Boot的自动配置逻辑也就是那些AutoConfiguration类按条件装配各种默认组件。发布启动完成事件程序进入运行状态开始监听请求。理解这个流程很重要因为它串起了你日常遇到的各种问题Bean找不到、配置没生效、端口被占用、自动配置没触发……本质上都能归到某一步出了问题。4.2 Bean的生命周期从诞生到销毁刚才提到容器会管理对象那对象在容器里的一生是什么样的Spring里管这些被容器管理的对象叫Bean。它的生命周期主干是实例化通过反射创建对象相当于new出来。属性填充给对象设置依赖的属性处理Autowired、Value等注解。初始化前处理执行BeanPostProcessor的前置方法和PostConstruct标注的方法。初始化调用InitializingBean接口或自定义init-method。初始化后处理执行BeanPostProcessor的后置方法这里也是AOP代理生成的常见时机。使用Bean在容器里被各个组件调用。销毁容器关闭时执行PreDestroy、DisposableBean等销毁逻辑。这串流程面试爱考实战也有用。比如你想在Bean创建后做一些自定义处理第一反应不应该是改代码加一堆构造逻辑而是想想能不能用一个BeanPostProcessor统一完成。4.3 顺着热词聊聊三级缓存热词里“spring三级缓存原理”也是高频搜索。它专门解决一个经典问题循环依赖。什么是循环依赖A依赖BB又依赖A两个对象互相引用像两个死循环。如果靠构造器注入容器创建A需要B、创建B又需要A直接卡死。如果用的是字段注入或Setter注入Spring就能靠三级缓存救回来一级缓存存已经创建完的成品Bean。二级缓存存提前暴露的半成品Bean。三级缓存存Bean的ObjectFactory也就是“能提前产出代理对象”的工厂。大致流程是A在创建时虽然属性还没填完先把一个早期引用暴露到三级缓存然后去创建BB创建时发现依赖A就从三级缓存里拿到A的早期引用完成自己的创建最后A再继续完成属性填充。这样绕一圈循环依赖就被解开了。不过我要提醒一句**别把三级缓存当常规设计去依赖。**循环依赖通常说明你的对象边界没划分清楚。我工作里碰到这种设计第一反应都是重构而不是感谢Spring帮你兜底。至于为什么三级缓存能解决而两级不行、二级缓存存在的意义是什么后面专门开一篇讲源码时再细聊这里先把结论和现象记住。5. 从概述到实战学习路线与新手避坑概述文写到最后我给新手一条比较实际的学习路径再回答几个我经常被问到的问题。这些内容是我带人和带项目时反复验证过的。5.1 我建议的学习顺序第一步Java基础得过关集合、反射、泛型、代理这些是读Spring源码的前置能力。第二步直接学Spring Framework核心重点啃IoC容器和AOP不要急着碰Boot先搞懂容器管理的是什么东西。第三步简单用一遍Spring MVC知道一个请求怎么从控制器进到服务层。第四步上Spring Boot感受自动配置带来的便利掌握常用starter和配置项。第五步追事务管理和Spring Security。第六步有分布式需求了再接触Spring Cloud。一个常见误区是一上来就整Spring Boot注解会用了但遇到“Bean为什么注不进来”这种基础问题就懵了。归根到底还是容器机制没吃透。**Boot只是壳Framework才是核。**我面试新人时如果这个人能把IoC和AOP讲清楚哪怕Boot经验少一点我都愿意给机会。5.2 常见疑问速查问题简短答案SpringBoot和Spring有什么区别Boot在Spring Framework基础上做自动配置和快速启动底层还是Framework什么是Bean由IoC容器创建和管理的对象Component和Bean有啥区别Component用在类上由容器扫描Bean用在方法上方法返回对象交给容器构造器注入被不推荐用字段注入构造器注入依赖明确、测得好、不可变字段注入隐藏依赖三级缓存是干嘛的解决字段注入/Setter注入场景下的循环依赖什么时候该用AOP日志、事务、权限、监控等横切逻辑别硬塞进业务方法Spring AI现在要不要学如果你是Java服务端建议了解它是生态新方向但先别动摇基础5.3 一些个人经验与后续预告我自己刚开始学Spring的时候也走过弯路。那会儿看了不少书概念背得滚瓜烂熟但一上手项目才发现真正难的不是语法而是“容器思维”。你以为你写的是一个类实际上你写的是给容器的一份说明书。把心态从“我new对象”切换成“我声明依赖”很多问题就豁然开朗了。另外我强烈建议新手找机会手写一个迷你版Spring不用完整哪怕只实现一个最简单的IoC容器根据包路径扫描类、反射创建实例、按Autowired注入字段这一套写完你对整个框架的理解会升华一大截。网上有很多手写Spring的教程热词里也有“手写Spring”可以按它一步步跟一下比纯啃源码的性价比高不少。这篇是Spring详解的开篇我们花了比较大的篇幅把地图摊开理清了Spring在解决什么问题、生态里有哪些成员、IoC和AOP该往哪个方向理解、一个程序启动时的主干流程。后续系列会沿着地图逐步深入先讲容器与Bean的细节再讲AOP源码然后切到事务、MVC、Boot自动配置最后可能覆盖Cloud和AI集成。如果你准备入坑或者正在啃Spring建议先把这篇的版图记在脑子里后面每篇文章你都能找到自己当前应该在的位置。下一篇我们直接从IoC容器入手聊Beans的一生。