Spring核心框架完全指南 – 基础知识全解析(2025版)
本指南基于2025年最新资源,聚焦Spring框架的核心概念,提供从入门到中级的全面解析。Spring框架是Java企业级开发的基石,已演进至6.x版本,支持Java 17+和Jakarta EE 9+。指南分为多个模块,结合代码示例、表格和关键点,帮助开发者快速掌握基础知识。内容来源于官方文档和权威教程,确保准确性和时效性。
一、Spring框架概述
Spring框架是一个开源的Java平台,提供全面的编程和配置模型,用于构建现代企业级应用。它简化了Java EE的复杂性,通过模块化设计支持任何部署环境(如云原生、服务器)。
关键优势
- 简化开发:处理基础设施(如事务、数据访问),让开发者专注业务逻辑。
- 模块化:核心模块可独立使用,生态包括Spring Boot、Cloud等。
- 非侵入式:业务代码不强依赖Spring API,便于迁移。
- 2025年现状:Spring 6.x为主,支持GraalVM Native Image、AOT编译,提升性能和启动速度。Java 17是基线,Jakarta EE迁移完成(javax → jakarta)。
Spring vs Spring Boot
- Spring Framework:提供核心功能(如DI、AOP),但需手动配置。
- Spring Boot:扩展Spring,提供自动配置、内嵌服务器和Starter依赖,适合快速开发。
示例:一个简单Spring Boot应用启动类:
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
二、核心概念:IoC(控制反转)和DI(依赖注入)
IoC是Spring的核心思想,将对象创建和管理的控制权从代码转移到容器。DI是IoC的具体实现,通过外部注入依赖,实现松耦合和易测试。
IoC容器
- BeanFactory:基础容器,轻量级,按需加载(懒加载)。
- ApplicationContext:高级容器,支持事件、国际化,按启动加载(预加载)。常用实现:ClassPathXmlApplicationContext、AnnotationConfigApplicationContext。
DI类型
| 类型 | 描述 | 示例(使用@Autowired) | 优缺点 |
|---|---|---|---|
| 构造函数注入 | 通过构造函数注入,必选依赖,推荐使用。 | @Autowired public Car(Engine engine) {} | 不可变、易测试;需无参构造备用。 |
| Setter注入 | 通过setter方法注入,可选依赖。 | @Autowired public void setEngine(Engine engine) {} | 灵活;可能导致不完整对象。 |
| 字段注入 | 直接注入字段,简单但不推荐。 | @Autowired private Engine engine; | 简洁;难测试,不支持final字段。 |
代码示例(构造函数DI):
@Component
public class Engine { /* ... */ }
@Component
public class Car {
private final Engine engine;
@Autowired
public Car(Engine engine) {
this.engine = engine;
}
}
三、Spring Beans:定义、管理与生命周期
Bean是Spring IoC容器管理的对象,代表应用的核心组件。
Bean定义
- 内部表示:BeanDefinition对象,包含类名、作用域、依赖等元数据。
- 配置方式:
- XML:
<bean id="car" class="com.example.Car"/> - 注解:
@Component、@Service、@Repository、@Controller - JavaConfig:
@Configuration类中用@Bean定义。
Bean作用域
| 作用域 | 描述 | 使用场景 |
|---|---|---|
| singleton (默认) | 容器中唯一实例,共享。 | 无状态服务层。 |
| prototype | 每次请求新实例。 | 有状态对象,如用户会话。 |
| request | 每个HTTP请求新实例。 | Web应用请求数据。 |
| session | 每个HTTP会话新实例。 | 用户会话数据。 |
| application | 整个ServletContext唯一。 | 全局配置。 |
注解示例:@Scope("prototype")
Bean生命周期
- 实例化:创建对象(反射或工厂方法)。
- 属性填充:注入依赖。
- 初始化:调用@PostConstruct、InitializingBean.afterPropertiesSet()、init-method。
- 使用:业务逻辑。
- 销毁:调用@PreDestroy、DisposableBean.destroy()、destroy-method。
示例(生命周期回调):
@Component
public class MyBean {
@PostConstruct
public void init() { System.out.println("Initialized"); }
@PreDestroy
public void cleanup() { System.out.println("Destroyed"); }
}
高级特性
- 懒加载:
@Lazy或lazy-init=true,延迟初始化。 - 自动装配:@Autowired,按类型/名称注入。
- 循环依赖解决:通过三级缓存(singletonObjects、earlySingletonObjects、singletonFactories)处理setter注入循环。
四、AOP(面向切面编程)
AOP处理横切关注点(如日志、事务),不影响业务代码。
核心概念
- Aspect:模块化关注点(如日志方面)。
- Join Point:应用执行点(如方法调用)。
- Advice:在Join Point执行的动作(Before、After、Around、AfterReturning、AfterThrowing)。
- Pointcut:匹配Join Point的表达式。
- Weaving:将Advice应用到目标对象。
代理机制
- JDK动态代理:基于接口。
- CGLIB:基于类(默认在无接口时)。
配置方式
- 注解式:@Aspect、@Before等。
- XML/Schema:aop:config。
示例(日志AOP):
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.Service.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Before: " + joinPoint.getSignature());
}
}
Spring AOP与AspectJ集成,支持更强大功能。
五、核心模块与扩展
Spring核心容器(spring-core、beans、context)是基础,其他模块构建其上:
- Data Access:spring-jdbc、orm、tx(事务)。
- Web:spring-webmvc、webflux(响应式)。
- Integration:事件处理、SpEL(Spring表达式语言,用于动态值如
#{systemProperties['user.name']})。 - Test:spring-test。
事件处理示例:发布ApplicationEvent,监听@EventListener。
六、2025年更新与最佳实践
Spring 6.x重点:Java 17+支持、Jakarta EE 9迁移、AOT(提前编译)增强GraalVM Native性能、响应式编程优化。推荐使用Spring Boot 3.x启动项目。
最佳实践:
- 优先构造函数DI。
- 使用注解配置,避免XML。
- 确保Bean线程安全(无状态singleton)。
- 监控循环依赖和事务失效。
- 集成测试用@SpringBootTest。
学习路线:从Spring Boot入门,再深究核心原理。项目实践是关键!
如果需要特定模块源码解析或示例代码,随时补充!