Spring Framework 简介
Java 企业级应用的基础框架 —— IoC、AOP、事务管理
官网:https://spring.io/projects/spring-framework
什么是 Spring Framework
Spring Framework 是一个开源的 Java 平台,为企业级 Java 应用提供全面的基础设施支持。它的核心设计理念是简化 Java 开发。
发展历史
| 版本 | 时间 | 里程碑 |
|---|---|---|
| Spring 1.0 | 2004.03 | Rod Johnson 发布,IoC 容器 + AOP |
| Spring 2.0 | 2006.10 | XML Schema 命名空间、简化配置 |
| Spring 3.0 | 2009.12 | Java 配置(@Configuration)、REST 支持 |
| Spring 4.0 | 2013.12 | Java 8 支持、WebSocket |
| Spring 5.0 | 2017.09 | 响应式编程(WebFlux)、Kotlin 支持 |
| Spring 6.0 | 2022.11 | Java 17+ 基线、AOT 编译支持 |
| Spring 6.1 | 2023.11 | Virtual Threads 支持、HTTP Interface |
作者
Rod Johnson —— 2002 年出版《Expert One-on-One J2EE Design and Development》,书中附带的框架代码后来演化为 Spring Framework。Spring 名称源于"简化 Java 开发"的理念 —— 让 Java 开发像春天一样温暖。
核心特性
IoC 容器(控制反转)
Spring 的核心是 IoC(Inversion of Control)容器,它负责管理对象的生命周期和依赖关系。
依赖注入方式
java
// 方式一:构造函数注入(推荐)
@Service
public class UserService {
private final UserRepository repository;
public UserService(UserRepository repository) {
this.repository = repository;
}
}java
// 方式二:Setter 注入
@Service
public class UserService {
private UserRepository repository;
@Autowired
public void setRepository(UserRepository repository) {
this.repository = repository;
}
}java
// 方式三:字段注入(不推荐,不利于测试)
@Service
public class UserService {
@Autowired
private UserRepository repository;
}配置方式演进
Spring 的配置方式经历了三个阶段:
| 方式 | 示例 | 适用场景 |
|---|---|---|
| XML 配置(1.x) | <bean id="userService" class="..." /> | 遗留项目 |
| 注解配置(2.5+) | @Service / @Autowired | 大部分项目 |
| Java 配置(3.0+) | @Configuration / @Bean | 推荐,类型安全 |
java
// Java 配置示例
@Configuration
@ComponentScan("com.example")
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}AOP(面向切面编程)
AOP 将横切关注点(日志、事务、安全等)与业务逻辑分离。
java
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("调用方法: " + joinPoint.getSignature());
}
@Around("@annotation(Loggable)")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
long start = System.currentTimeMillis();
Object result = pjp.proceed();
System.out.println("耗时: " + (System.currentTimeMillis() - start) + "ms");
return result;
}
}| 通知类型 | 说明 |
|---|---|
@Before | 方法执行前 |
@AfterReturning | 方法正常返回后 |
@AfterThrowing | 方法抛出异常后 |
@After | 方法结束后(finally) |
@Around | 环绕通知,可控制方法执行 |
事务管理
Spring 提供声明式事务管理,通过 @Transactional 注解即可:
java
@Service
public class OrderService {
@Transactional
public void createOrder(Order order) {
orderDao.save(order);
inventoryDao.decrease(order.getProductId(), order.getQuantity());
// 任何异常都会自动回滚
}
@Transactional(readOnly = true)
public Order getOrder(Long id) {
return orderDao.findById(id);
}
}数据访问
Spring 提供了统一的数据访问抽象层:
- JDBC —
JdbcTemplate简化 JDBC 操作 - ORM — 集成 JPA / Hibernate / MyBatis
- 事务 — 声明式事务管理
java
@Repository
public class UserDao {
private final JdbcTemplate jdbcTemplate;
public UserDao(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public List<User> findAll() {
return jdbcTemplate.query("SELECT * FROM users",
(rs, row) -> new User(rs.getLong("id"), rs.getString("name")));
}
}Web 支持
Spring MVC
基于 Servlet 的传统 Web 框架:
java
@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserService userService;
@GetMapping
public List<User> list() {
return userService.findAll();
}
@PostMapping
public User create(@RequestBody User user) {
return userService.create(user);
}
@GetMapping("/{id}")
public User get(@PathVariable Long id) {
return userService.findById(id);
}
}Spring WebFlux
Spring 5 引入的响应式 Web 框架,适用于高并发场景:
java
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping
public Flux<User> list() {
return Flux.just(new User(1L, "Alice"), new User(2L, "Bob"));
}
@PostMapping
public Mono<User> create(@RequestBody User user) {
return Mono.just(user);
}
}| 特性 | Spring MVC | WebFlux |
|---|---|---|
| 模型 | Servlet(阻塞) | Reactive(非阻塞) |
| 容器 | Tomcat / Jetty | Netty / Tomcat / Undertow |
| 线程模型 | 每个请求一个线程 | 事件循环 |
| 适用场景 | 传统 Web 应用 | 高并发 I/O 密集型 |
Spring 生态
| 项目 | 说明 |
|---|---|
| Spring Boot | 快速构建生产级应用,自动配置 + Starters |
| Spring Cloud | 微服务全套解决方案(配置、网关、负载均衡) |
| Spring Data | 统一的数据访问抽象(JPA、Redis、MongoDB 等) |
| Spring Security | 认证授权框架 |
| Spring Batch | 批处理框架 |
| Spring Integration | 企业集成模式(EIP)实现 |
IoC vs DI
| 概念 | 说明 |
|---|---|
| IoC(控制反转) | 对象创建和依赖管理的控制权从应用代码反转给容器 |
| DI(依赖注入) | IoC 的具体实现方式,容器负责注入依赖 |
简单来说:IoC 是思想,DI 是实现。
参考文档
- Spring Core 文档 — IoC 容器、AOP、资源管理
- Spring MVC 文档 — Web 框架
- Spring 官方文档