看过源码吗?说下 Spring 由哪些重要的模块组成?
- 标签:后端、Spring
🏛 业务架构师
Spring 的模块化我按能力分层讲(5.x 体系):
- core:ioc 容器(BeanFactory、ApplicationContext)与资源抽象——地基,一切能力都长在容器上;
- beans:Bean 定义、实例化、依赖注入、生命周期管理;
- context:国际化、事件传播(ApplicationEvent)、环境抽象(profile)——业务事件驱动的载体在这层;
- aop:切面实现(与 aspjectj 集成)——事务、缓存、异步注解的物理支撑;
- tx/jdbc/orm:事务抽象与数据访问——统一的事务管理 API 屏蔽了不同资源的事务差异(DB、MQ),声明式事务的根;
- web/spring-webmvc:DispatcherServlet 为核心的 Web 层——HandlerMapping/Adapter/Interceptor 管线;
- messging/reactive(webflux):响应式栈;
- test:测试支撑(上下文缓存、Mock)。
业务架构视角的两个观察:
- 模块边界=职责边界的教学范本:容器(core)只管对象生命周期,不掺业务;AOP 是可插拔增强;Web 是入口适配。每层只对自己的抽象负责——业务系统的分包(api/domain/infra)应该学习这种纪律,我们内部标准模板就按此裁剪;
- 按需引入是成本纪律:老 Spring 时代一个全家桶 jar 什么都带;Boot 时代模块化成 starter,用多少引多少——依赖面就是安全面(Log4j 漏洞事件里,引得少的团队修复快得多)。我做依赖治理时的原则:每个依赖都要能回答"哪个功能在用它",答不上的就是待清理项。
一句话:Spring 的模块图是一张**"能力如何分层组装"的地图**——看懂它,业务系统的结构设计就有了参照系。
🏗 系统架构师
按 Spring Framework 5/6 的模块划分,我按"核心 → 数据 → Web → 其他"四层讲:
核心容器:
- spring-core / beans:BeanFactory、BeanDefinition、依赖注入内核;
- spring-context:ApplicationContext、事件、国际化、@Configuration;
- spring-expression(SpEL):运行时表达式;
- spring-aop:AOP 抽象(JDK/CGLIB 代理、AspectJ 注解支持);
数据访问:
- spring-jdbc(JdbcTemplate、事务抽象核心 @Transactional 的 PlatformTransactionManager 在这里)、spring-tx(事务管理,含传播行为定义)、spring-orm(JPA/Hibernate 集成)、spring-oxm、spring-jms;
Web:
- spring-web:Servlet 基础设施、RestTemplate/RestClient、编解码;
- spring-webmvc:DispatcherServlet、@Controller 体系;
- spring-webflux:响应式(Reactor + Netty);
其他:spring-messaging(STOMP/消息抽象)、spring-aspects(AspectJ 集成)、spring-instrument(AOP 类装载代理)、spring-test(JUnit 集成、MockMvc、@SpringBootTest)。
我的理解主线:所有模块围绕"IOC 容器 + AOP"两个内核组织——core 提供装配能力,其余模块是对接各技术栈的"适配层"(每种外部技术一个 Template + 一套注解抽象)。这个"内核 + 适配"的结构本身就是框架设计的范本,我做公司内部框架时直接照抄这个分层:核心装配层稳定,生态适配层按需扩展。
💻 全栈开发专家
Spring 5/6 之后模块做了扁平化重组,我按"平时真正打交道的"梳理:
核心容器(最重):
spring-core:Utils、资源抽象(Resource)、cglib/字节码支撑;spring-beans:BeanFactory、BeanDefinition、属性编辑器——IOC 核心;spring-context:ApplicationContext、事件机制、@ComponentScan、BeanPostProcessor 体系——Bean 生命周期管理的主战场;spring-expression:SpEL(@Value("#{...}"))。
AOP:spring-aop(代理工厂、Pointcut/Advice 抽象)+ spring-aspects(AspectJ 注解集成)。
数据访问:spring-jdbc(JdbcTemplate)、spring-tx(声明式事务,@Transactional 的实现地)、spring-orm(JPA/Hibernate 集成)、spring-oxm。
Web:spring-web(基础 Servlet API 抽象)、spring-webmvc(DispatcherServlet 体系、REST 支持)、spring-webflux(响应式,Reactor 基础上)。
其他:spring-messaging(STOMP/消息模板)、spring-test(测试体系:@SpringJUnitConfig、MockMvc)。
源码入口建议(面试说出来很加分):看 Bean 生命周期从 AbstractApplicationContext.refresh() 进;自动配置从 ConfigurationClassPostProcessor 进;事务从事务 TransactionInterceptor 进;MVC 从 DispatcherServlet.doDispatch() 进。模块划分是"知识地图",源码入口才是真功夫。