Spring 框架核心构成与模块解析:从核心容器到企业级集成
Spring 框架是 Java 企业级开发的 “基石”,其设计理念是 “模块化、松耦合、可扩展”,通过分层的模块架构覆盖从 “核心 IOC 容器” 到 “Web 开发”“数据访问”“AOP 切面” 等全场景需求。从 “核心容器→数据访问→Web 开发→AOP 与扩展” 四大维度,详细拆解每个模块的职责、核心组件及实际应用场景,并梳理模块间的协作关系。
Spring 框架整体架构图

核心容器层(Core Container):Spring 的 “地基”
核心容器是 Spring 框架的基础核心,提供 IOC(控制反转) 和 DI(依赖注入) 核心能力,所有其他模块均依赖于此层。其核心目标是 “管理对象的生命周期与依赖关系”,降低代码耦合度。
1. Spring Core:核心工具类与 IOC 基础
- 核心职责:提供 Spring 框架的底层核心工具类,是 IOC 容器的 “骨架”。
- 核心组件:
- BeanFactory:IOC 容器的顶层接口,采用工厂模式管理 Bean,负责 Bean 的创建、依赖注入与生命周期控制。
- 特点:延迟初始化(容器实例化时不创建 Bean,仅在调用
getBean()时才实例化并装配依赖),适合内存敏感场景。 - 常用实现:
DefaultListableBeanFactory(Spring 内部默认实现,支持 XML / 注解配置)。
- 特点:延迟初始化(容器实例化时不创建 Bean,仅在调用
- BeanDefinition:描述 Bean 的 “元数据”(如类名、属性、依赖、作用域等),是容器创建 Bean 的依据。
- BeanFactory:IOC 容器的顶层接口,采用工厂模式管理 Bean,负责 Bean 的创建、依赖注入与生命周期控制。
- 关键作用:定义 IOC 容器的基本规范,为其他模块提供基础支持(如 Bean 注册、依赖解析)。
2. Spring Beans:Bean 管理核心
- 核心职责:封装 Bean 的创建、配置、装配逻辑,是 IOC 容器的 “具体实现者”。
- 核心组件:
- BeanFactory 扩展类:如
XmlBeanFactory(已过时,推荐DefaultListableBeanFactory)、AnnotationConfigApplicationContext(注解配置容器)。 - Bean 生命周期接口:如
InitializingBean(Bean 初始化后回调)、DisposableBean(Bean 销毁前回调),支持自定义 Bean 生命周期逻辑。 - 依赖注入工具:如
AutowiredAnnotationBeanPostProcessor(处理@Autowired注解)、CommonAnnotationBeanPostProcessor(处理@Resource注解)。
- BeanFactory 扩展类:如
- 关键作用:将 “对象创建” 与 “业务逻辑” 解耦,开发者无需手动
new对象,由容器统一管理。
3. Spring Context:上下文与企业级特性
核心职责:在 Core 和 Beans 基础上,扩展 IOC 容器的能力,提供企业级特性(如国际化、事件传播、资源加载),是 “增强版 BeanFactory”。
核心组件:
- ApplicationContext:Context 模块的顶层接口,继承BeanFactory,提供更丰富的功能:
- 特点:立即初始化(容器实例化时,自动实例化所有 “单例 Bean” 并装配依赖),适合大多数企业级场景。
- 常用实现:
ClassPathXmlApplicationContext(从类路径加载 XML 配置);FileSystemXmlApplicationContext(从文件系统加载 XML 配置);AnnotationConfigApplicationContext(从注解类加载配置,如@Configuration)。
- 国际化支持:
MessageSource接口,支持多语言配置(如messages_zh_CN.properties、messages_en_US.properties)。 - 事件机制:
ApplicationEvent(事件)与ApplicationListener(监听器),支持组件间解耦通信(如 “用户注册成功后发送通知”)。 - 资源加载:
Resource接口,统一处理类路径、文件系统、URL 等资源(如ClassPathResource、FileSystemResource)。
- ApplicationContext:Context 模块的顶层接口,继承BeanFactory,提供更丰富的功能:
关键区别(与 BeanFactory):
| 特性 | BeanFactory | ApplicationContext(Context) |
| ————— | —————————————— | ——————————————————- |
| 初始化策略 | 延迟初始化(getBean 时创建) | 立即初始化(容器启动时创建单例 Bean) |
| 功能范围 | 基础 Bean 管理 | 基础管理 + 国际化 / 事件 / 资源加载等 |
| 适用场景 | 内存敏感场景(如移动端) | 企业级应用(绝大多数场景) |
4. Spring EL(Expression Language):表达式语言
- 核心职责:提供强大的表达式语言,支持在配置文件或注解中动态访问 / 操作对象属性、方法、数组等,简化配置。
- 核心能力:
- 访问 Bean 属性:
#{user.name}(获取userBean 的name属性); - 调用方法:
#{user.getAge() + 1}(调用user的getAge()并加 1); - 操作集合:
#{users[0].name}(获取users集合第一个元素的name); - 调用静态方法:
#{T(java.lang.Math).random()}(生成随机数)。
- 访问 Bean 属性:
- 应用场景:
- XML 配置:
<property name="age" value="#{user.age + 5}"/>; - 注解配置:
@Value("#{systemProperties['user.dir']}")(注入系统属性)。
- XML 配置:
数据访问 / 集成层(Data Access/Integration):简化数据交互
数据访问层是 Spring 对 “数据库操作、消息队列、对象映射” 等数据交互场景的封装,核心目标是简化数据访问代码,统一异常处理,支持事务管理。
1. Spring JDBC:JDBC 抽象层
核心职责:封装原生 JDBC 的冗余代码(如连接创建、Statement 管理、异常处理),提供简洁的 JDBC 操作 API。
核心组件:
JdbcTemplate:核心工具类,封装了 JDBC 的增删改查逻辑,开发者只需关注 SQL 与参数:
1
2
3
4
5
6
7// 示例:查询用户
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
User user = jdbcTemplate.queryForObject(
"SELECT id, name FROM user WHERE id = ?",
new Object[]{1L},
(rs, rowNum) -> new User(rs.getLong("id"), rs.getString("name"))
);NamedParameterJdbcTemplate:支持命名参数(如:id),避免参数索引错误:
1
2
3String sql = "SELECT id, name FROM user WHERE id = :id";
Map<String, Object> params = Map.of("id", 1L);
User user = namedJdbcTemplate.queryForObject(sql, params, rowMapper);SQLExceptionTranslator:统一 JDBC 异常(如
SQLSyntaxErrorException)为 Spring 自定义异常(如DataAccessException),简化异常处理。
关键优势:无需手动关闭连接 / Statement,自动处理异常,代码量减少 50% 以上。
2. Spring ORM:对象关系映射集成
核心职责:整合主流 ORM 框架(如 Hibernate、MyBatis、JPA),提供统一的编程模型与事务管理支持,避免 ORM 框架与业务代码强耦合。
支持的 ORM 框架:
- Hibernate:通过
HibernateTemplate封装 Hibernate 操作,统一异常与事务; - MyBatis:通过
SqlSessionTemplate整合 MyBatis,支持 Spring 事务管理; - JPA:通过
JpaTemplate或EntityManagerFactory整合 JPA,支持注解式查询(如@Query)。
- Hibernate:通过
应用场景:
1
2
3
4
5
6
7
8
9
10
11// Spring 整合 MyBatis 示例
public class UserService {
private UserMapper userMapper; // MyBatis Mapper 接口
// Spring 事务注解(统一事务管理)
public User getUserById(Long id) {
return userMapper.selectById(id);
}
}
3. Spring OXM:对象 - XML 映射
核心职责:提供对象与 XML 之间的映射抽象层,支持主流 OXM 框架(如 JAXB、XStream、Castor),统一 XML 序列化 / 反序列化 API。
核心组件:
- Marshaller:将 Java 对象序列化为 XML;
- Unmarshaller:将 XML 反序列化为 Java 对象。
应用场景:
1
2
3
4
5
6
7
8
9
10
11
12// JAXB 实现 OXM 示例
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setClassesToBeBound(User.class); // 绑定需要映射的类
// 对象转 XML
User user = new User(1L, "张三");
StringWriter writer = new StringWriter();
marshaller.marshal(user, new StreamResult(writer));
String xml = writer.toString(); // <user><id>1</id><name>张三</name></user>
// XML 转对象
User userFromXml = (User) marshaller.unmarshal(new StreamSource(new StringReader(xml)));
4. Spring JMS:消息服务集成
核心职责:封装 Java Message Service(JMS)API,支持主流消息中间件(如 ActiveMQ、RabbitMQ),简化消息的生产与消费。
核心组件:
- JmsTemplate:核心工具类,封装 JMS 连接创建、会话管理、消息发送 / 接收逻辑;
- MessageListenerContainer:消息监听容器,支持异步接收消息(如
DefaultMessageListenerContainer)。
应用场景:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16// 发送消息
private JmsTemplate jmsTemplate;
public void sendMessage(String queueName, String message) {
jmsTemplate.convertAndSend(queueName, message);
}
// 接收消息
public class MessageListener {
// 监听指定队列
public void onMessage(String message) {
System.out.println("收到消息:" + message);
}
}
5. Spring Transaction:事务管理
核心职责:提供声明式事务与编程式事务支持,统一事务管理逻辑,支持多种事务管理器(如 JDBC 事务、ORM 事务、JMS 事务)。
核心特性:
声明式事务:通过@Transactional注解或 XML 配置,无需手动编写事务代码(推荐):
1
2
3
4
5
6
7
8
9
10
11
12
public class OrderService {
private OrderMapper orderMapper;
// 声明式事务:方法执行异常时自动回滚
public void createOrder(Order order) {
orderMapper.insert(order);
// 其他业务逻辑(如扣减库存)
}
}编程式事务:通过TransactionTemplate手动控制事务(灵活但代码冗余):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private TransactionTemplate transactionTemplate;
public void createOrder(Order order) {
transactionTemplate.execute(status -> {
try {
orderMapper.insert(order);
return true;
} catch (Exception e) {
status.setRollbackOnly(); // 手动回滚
return false;
}
});
}
关键优势:与数据访问层无缝集成,支持跨数据源事务(分布式事务需配合 Spring Cloud Alibaba Seata 等组件)。
Web 层:Web 应用开发支持
Web 层是 Spring 对 Web 应用开发的支持,核心是 Spring MVC,提供 “请求处理、视图渲染、参数绑定” 等全流程 Web 开发能力,是 Java Web 开发的主流框架之一。
1. Spring Web:基础 Web 集成
- 核心职责:提供 Web 应用的基础集成能力,如 Web 上下文、请求拦截、Servlet 适配等,是 Web-Servlet(Spring MVC)的基础。
- 核心组件:
- WebApplicationContext:Web 环境下的 Spring 上下文,继承
ApplicationContext,添加 Web 相关特性(如获取 ServletContext); - DispatcherServlet:Spring MVC 的核心 Servlet(前端控制器),负责接收所有请求并分发(后续 Web-Servlet 模块详解);
- HandlerInterceptor:请求拦截器,支持在请求处理前 / 后、视图渲染后执行自定义逻辑(如登录验证、日志记录)。
- WebApplicationContext:Web 环境下的 Spring 上下文,继承
2. Spring Web-Servlet(Spring MVC):MVC 框架
核心职责:实现 MVC(Model-View-Controller)设计模式,是 Spring Web 层的核心,负责 Web 请求的接收、处理与响应。
核心流程(请求处理):
- 客户端发送请求,由
DispatcherServlet(前端控制器)接收; DispatcherServlet调用HandlerMapping(处理器映射),根据请求 URL 找到对应的Controller(处理器);DispatcherServlet调用HandlerAdapter(处理器适配器),执行Controller的业务逻辑,返回ModelAndView(模型 + 视图);DispatcherServlet调用ViewResolver(视图解析器),将ModelAndView解析为具体视图(如 JSP、Thymeleaf);- 视图渲染模型数据,返回响应给客户端。
- 客户端发送请求,由
核心组件:
- @Controller:标记类为控制器,处理 HTTP 请求;
- @RequestMapping:映射请求 URL 到方法(如
@GetMapping("/user/{id}")); - @RequestParam/@PathVariable:绑定请求参数到方法参数;
- ViewResolver:视图解析器(如
InternalResourceViewResolver解析 JSP,ThymeleafViewResolver解析 Thymeleaf)。
应用场景:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// Spring MVC Controller 示例
public class UserController {
private UserService userService;
// 处理 GET 请求:/user/1
public String getUser( Long id, Model model) {
User user = userService.getUserById(id);
model.addAttribute("user", user); // 模型数据
return "userDetail"; // 视图名(由 ViewResolver 解析为 userDetail.jsp)
}
}
3. Spring Web-Struts(已弃用)
- 核心职责:早期用于整合 Apache Struts 框架(另一个 MVC 框架),实现 Spring 容器与 Struts 控制器的协作。
- 现状:Spring 3.0 后正式弃用,原因是 Spring MVC 功能更完善、集成更简单,且 Struts 框架逐渐被 Spring MVC 取代。
4. Spring Web-Portlet:Portlet 环境支持
- 核心职责:为 Portlet 环境(如门户网站的模块化组件)提供 MVC 实现,适配 Portlet 的请求生命周期(如
ACTION_PHASE、RENDER_PHASE)。 - 应用场景:仅用于传统 Portlet 开发(如 Liferay 门户),目前主流 Web 应用已很少使用。
AOP 与扩展层:增强代码能力与框架集成
AOP(面向切面编程)是 Spring 框架的另一大核心特性,通过 “横切关注点”(如日志、事务、权限)的模块化,实现代码的 “关注点分离”,减少重复代码。
1. Spring AOP:面向切面编程核心
核心职责:提供符合 AOP 规范的切面编程实现,支持在不修改原有代码的情况下,为方法添加增强逻辑(如前置通知、后置通知、异常通知)。
核心概念:
- 切面(Aspect):封装横切关注点的类(如
LogAspect); - 连接点(JoinPoint):可能被增强的方法(如所有
Service层的方法); - 切入点(Pointcut):定义哪些连接点需要被增强(如
execution(* com.example.service.*.*(..))); - 通知(Advice):切面的具体增强逻辑(如
@Before前置通知、@AfterReturning后置通知)。
- 切面(Aspect):封装横切关注点的类(如
实现方式:
基于注解(推荐):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// 切面类
public class LogAspect {
// 切入点:匹配所有 Service 层方法
public void servicePointcut() {}
// 前置通知:方法执行前记录日志
public void beforeAdvice(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName();
System.out.println("方法 " + methodName + " 开始执行");
}
}基于 XML 配置:早期方式,现已被注解取代。
关键优势:横切逻辑与业务逻辑解耦(如日志、事务无需嵌入业务代码),便于维护与扩展。
2. Spring Aspects:AspectJ 集成
- 核心职责:整合 AspectJ 框架(最成熟的 AOP 框架),扩展 Spring AOP 的功能(如支持更多切入点表达式、类型间通知等)。
- 核心特性:
- 支持 AspectJ 注解(如
@Aspect、@Pointcut),Spring AOP 原生已支持部分 AspectJ 语法; - 提供
AspectJWeavingEnabler,支持编译期织入(Compile-Time Weaving)与加载期织入(Load-Time Weaving)。
- 支持 AspectJ 注解(如
- 应用场景:需要复杂 AOP 逻辑时(如类初始化增强、静态方法增强),Spring AOP 原生能力不足,可借助 AspectJ。
3. Spring Instrumentation:类加载增强
- 核心职责:提供类加载器(ClassLoader)增强与类字节码修改能力,支持在 JVM 加载类时动态修改类定义(如 AOP 的加载期织入)。
- 核心组件:
- Instrumentation:JVM 提供的工具接口,Spring 封装为
SpringInstrumentor; - LoadTimeWeaver:加载期织入器,支持在类加载时织入 AOP 切面(如
TomcatLoadTimeWeaver适配 Tomcat 容器)。
- Instrumentation:JVM 提供的工具接口,Spring 封装为
- 应用场景:主要用于 AOP 加载期织入(无需编译期修改字节码),或自定义类加载逻辑(如热部署、类加密解密)。
模块间协作关系:Spring 如何 “串联” 所有功能
Spring 各模块并非独立存在,而是通过 “核心容器” 为纽带,形成有机整体。以 “Web 应用查询用户” 为例,梳理模块协作流程:
- Web 层(Spring MVC):
DispatcherServlet接收/user/1请求,通过HandlerMapping找到UserController的getUser方法; - AOP 层:
@Transactional注解触发 Spring AOP,创建事务代理,为UserService的getUserById方法添加事务增强; - 业务层(依赖核心容器):
UserController依赖UserService(由ApplicationContext注入,IOC 容器管理); - 数据访问层(Spring MyBatis 集成):
UserService调用UserMapper(MyBatis Mapper 接口,由 Spring 管理),SqlSessionTemplate执行 SQL; - 事务管理(Spring Transaction):若 SQL 执行成功,事务自动提交;若异常,自动回滚;
- 核心容器:全程由
ApplicationContext管理 Bean 的创建、依赖注入与生命周期(如UserController、UserService、UserMapper均为容器中的 Bean)。
总结:Spring 框架的核心价值
Spring 框架通过模块化设计,实现了 “一站式” 企业级开发支持,其核心价值体现在:
- 解耦:IOC/DI 降低对象依赖耦合,AOP 降低横切逻辑与业务逻辑耦合;
- 简化开发:封装 JDBC、MVC、事务等冗余代码,开发者专注业务逻辑;
- 可扩展:模块化架构支持按需引入模块(如仅用核心容器 + JDBC,或全量引入 Web+AOP+ORM);
- 生态丰富:与 MyBatis、Hibernate、RabbitMQ、Spring Boot、Spring Cloud 等无缝集成,形成庞大生态