Spring框架自诞生以来一直是Java生态中最重要的企业级开发框架,几乎所有的后端岗位招聘要求里都会出现它的身影。不过很多人学Spring的时候容易陷入碎片化学习,会用注解却说不清原理,能跑项目却讲不明白IoC到底反转了什么。这篇文章就从核心概念、功能模块到实战场景,把Spring框架的知识体系完整梳理一遍。

一、Spring的核心概念:IoC与依赖注入
IoC(Inversion of Control,控制反转)是Spring框架的基石。所谓控制反转,指的是对象的创建和管理权从开发者手中转移到了容器手中。传统开发中我们需要一个对象时,会自己new出来,对象之间的依赖关系硬编码在程序里;而使用Spring后,对象的实例化、装配、销毁全部由IoC容器负责,我们只需要通过配置或注解声明依赖关系即可。
依赖注入(DI)是实现IoC的主要手段。容器在创建Bean时,会主动把它依赖的其他对象注入进来,常见的注入方式有构造器注入、Setter注入和字段注入三种。其中构造器注入是官方推荐的方式,因为它能保证依赖不可变且不为空,也方便单元测试。
@Service
public class OrderService {
private final PaymentService paymentService;
// 构造器注入:官方推荐,依赖不可变
@Autowired
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
public void createOrder() {
paymentService.pay();
}
}理解IoC还有一个关键点是Bean的生命周期。一个Bean从实例化、属性填充、初始化到销毁,中间会经历多个回调阶段,比如@PostConstruct标注的初始化方法、BeanPostProcessor的前后置处理等。掌握生命周期不仅能帮助理解框架运行机制,也是排查诸如循环依赖、代理失效等常见问题的基础。
二、AOP面向切面编程与声明式事务
AOP(Aspect-Oriented Programming)解决的是横切关注点的问题。日志记录、权限校验、性能监控这类逻辑散落在各个业务方法中,如果每个方法都写一遍,代码重复且难以维护。AOP的思想是把这类通用逻辑抽成切面,通过动态代理在方法执行前后织入,业务代码保持干净。
Spring AOP基于动态代理实现:目标类有接口时默认使用JDK动态代理,没有接口时使用CGLIB生成子类代理。下面是一个简单的切面示例,统计服务方法的执行耗时。
@Aspect
@Component
public class LogAspect {
// 定义切点:拦截service包下所有类的所有方法
@Pointcut("execution(* com.example.service..*.*(..))")
public void servicePointcut() {}
@Around("servicePointcut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
try {
return joinPoint.proceed();
} finally {
long cost = System.currentTimeMillis() - start;
System.out.println(joinPoint.getSignature() + " 耗时: " + cost + "ms");
}
}
}声明式事务是AOP最经典的应用。只需在方法上添加@Transactional注解,Spring就会自动开启、提交或回滚事务。但使用时有几个容易踩的坑:注解只对public方法生效;同一个类内部方法自调用会导致代理失效;默认只对运行时异常回滚,受检异常需要通过rollbackFor属性显式指定。这些细节在面试和实际排查问题中都非常重要。
三、Spring Boot快速开发与使用场景选型
传统Spring项目需要编写大量XML配置,配置繁琐一直是被诟病的地方。Spring Boot的出现就是为了简化这个问题,它通过约定大于配置的理念、自动装配机制以及内嵌Web容器,让开发者用极少的配置就能启动一个Web应用。@SpringBootApplication注解组合了自动装配、组件扫描等功能,配合application.yml即可完成绝大部分配置工作。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
}在实际项目选型上,新项目基本都直接使用Spring Boot搭配Spring Cloud构建微服务架构,单体应用则选择Spring Boot加Spring MVC的组合。如果是高并发场景,可以引入Spring WebFlux采用响应式编程模型。需要提醒的是,框架只是工具,理解背后的IoC、AOP思想才是掌握Spring的关键,否则换一个框架又会从零学起。
总结一下,Spring框架的知识主线可以概括为:以IoC容器管理对象,以AOP处理横切逻辑,以声明式事务简化数据操作,再通过Spring Boot降低使用门槛。沿着这条主线由浅入深地学习,配合实际项目练习,很快就能建立起属于自己的Spring知识体系。
Spring框架IoC容器Spring Boot修改时间:2026-09-09 06:26:26