Spring Framework 是 Java 企业级开发的基石框架,它通过模块化设计实现了“轻量级”、“非侵入式”和“一站式”的特性。理解 Spring 的核心模块结构,是掌握其原理与应用的关键。
本文将全面解析 Spring Framework 的五大核心模块体系:
我们将从每个模块的功能定位、技术实现和典型应用场景出发,结合代码示例,帮助你构建完整的 Spring 知识体系,适合初学者入门和中高级开发者进阶提升。
Spring 不只是一个框架,而是一个庞大的生态系统。它的设计哲学是解耦、可插拔、高度模块化。Spring 的各个模块可以独立使用,也可以组合成一个完整的解决方案。
掌握 Spring 各个核心模块的功能和作用机制,有助于我们:
模块 | 功能描述 |
---|---|
Core Container(核心容器) | 提供 IoC 容器、Bean 管理、SpEL 表达式语言等基础功能 |
AOP 和 Instrumentation | 支持面向切面编程及类增强 |
Data Access / Integration(数据访问/集成) | 提供对数据库操作的支持,如 JDBC、ORM、事务管理 |
Web 模块 | 支持 Web 开发,包括 MVC、响应式编程、WebSocket 等 |
Test 模块 | 提供单元测试和集成测试支持 |
组件 | 描述 |
---|---|
BeanFactory |
最基础的容器接口,支持延迟加载 Bean |
ApplicationContext |
扩展自 BeanFactory ,提供更多企业级功能 |
BeanDefinition |
描述 Bean 的元信息(类名、作用域、构造参数等) |
SpEL |
如 @Value("#{systemProperties['user.name']}") |
@Component
public class UserService {
@Value("#{T(java.util.Arrays).asList('a','b','c')}")
private List<String> roles;
}
注解 | 描述 |
---|---|
@Aspect |
定义切面类 |
@Before |
方法执行前织入逻辑 |
@After |
方法执行后织入逻辑 |
@Around |
环绕通知,最常用 |
@Pointcut |
定义切入点表达式 |
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Method called: " + joinPoint.getSignature().getName());
}
}
接口 | 描述 |
---|---|
PlatformTransactionManager |
事务管理器接口 |
DataSource |
数据源抽象 |
JdbcTemplate |
Spring 封装的 JDBC 工具类 |
EntityManager |
JPA 中的核心接口 |
@Service
@Transactional
public class OrderService {
@Autowired
private OrderRepository orderRepository;
public void placeOrder(Order order) {
orderRepository.save(order);
// 如果出现异常,整个事务回滚
}
}
注解 | 描述 |
---|---|
@Controller |
控制器类,返回视图名称 |
@RestController |
返回 JSON 数据 |
@RequestMapping |
映射请求路径 |
@GetMapping , @PostMapping |
HTTP 方法映射 |
@RequestBody , @ResponseBody |
请求体与响应体处理 |
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
}
@RestController
public class ReactiveUserController {
@Autowired
private ReactiveUserService userService;
@GetMapping("/users/{id}")
public Mono<User> getUser(@PathVariable String id) {
return userService.findById(id);
}
}
注解 | 描述 |
---|---|
@RunWith(SpringRunner.class) |
JUnit4 配置 |
@ExtendWith(SpringExtension.class) |
JUnit5 配置 |
@SpringBootTest |
加载完整上下文 |
@DataJpaTest 、@WebMvcTest |
只加载特定模块上下文 |
@MockBean 、@SpyBean |
创建模拟对象 |
@Transactional |
测试方法默认事务提交后回滚 |
@SpringBootTest
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void testGetUserById() {
User user = userService.getUserById(1L);
assertNotNull(user);
}
}
com.example.user
├── controller
│ └── UserController.java
├── service
│ └── UserService.java
├── repository
│ └── UserRepository.java
├── entity
│ └── User.java
├── aspect
│ └── LoggingAspect.java
└── config
└── AppConfig.java
// Controller
@PostMapping("/register")
public ResponseEntity<String> registerUser(@RequestBody User user) {
userService.register(user);
return ResponseEntity.ok("注册成功");
}
// Service
@Transactional
public void register(User user) {
userRepository.save(user);
sendWelcomeEmail(user.getEmail());
}
// AOP
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.user.service.UserService.*(..))")
public void beforeServiceCall(JoinPoint jp) {
System.out.println("调用方法:" + jp.getSignature().getName());
}
}
实践 | 说明 |
---|---|
模块按需引入 | 如只需使用 DI 功能,仅引入 spring-context 即可 |
推荐使用 Spring Boot | 自动装配机制极大简化了模块配置 |
使用 @ComponentScan 自动扫描 Bean |
减少手动配置 |
优先使用构造器注入 | 更利于单元测试 |
使用 AOP 分离业务与非业务逻辑 | 提高代码复用性 |
使用事务时注意传播行为和隔离级别 | 避免脏读、不可重复读等问题 |
合理使用测试注解 | 提升测试效率和覆盖率 |
答:主要包括 Core Container、AOP、Data Access/Integration、Web、Test 五大模块。
答:IOC 负责管理对象生命周期,AOP 负责在不修改业务逻辑的前提下插入横切逻辑,两者共同构成了松耦合的设计模式。
答:MVC 是传统的同步阻塞模型,WebFlux 是响应式非阻塞模型,适用于高并发场景。
答:基于 AOP 实现,通过代理方式拦截方法调用,并根据注解或配置开启事务、提交或回滚。
答:支持上下文加载、依赖注入、事务控制、模拟对象注入等,极大提升了测试效率。
Spring Framework 的强大之处在于其清晰的模块划分和高度的可扩展性。通过本篇文章的学习,你应该已经掌握了: