核心概念
Spring 框架是一个轻量级的企业级 Java 开发框架,其核心价值在于通过 IoC(控制反转) 和 AOP(面向切面编程) 两大核心技术,简化企业应用开发,降低代码耦合度,提升可维护性和可测试性。
选择 Spring 的主要原因可以归纳为:
- 对象管理自动化:通过 IoC 容器管理对象生命周期和依赖关系
- 横切关注点分离:通过 AOP 实现日志、事务、安全等通用功能的模块化
- 生态系统完整:提供从 Web 到数据访问、消息队列、安全认证的全栈解决方案
- 非侵入式设计:基于 POJO 编程,不强制继承特定类或实现特定接口
原理与关键点
1. IoC 容器的核心价值
传统开发中,对象之间的依赖关系由程序员手动创建和管理:
// 传统方式:紧耦合
public class UserService {
private UserDao userDao = new UserDaoImpl(); // 硬编码依赖
public User getUser(Long id) {
return userDao.findById(id);
}
}
问题:
UserService直接依赖具体实现UserDaoImpl,难以替换和测试- 修改依赖时需要修改所有使用处
Spring 通过 IoC 容器反转控制权:
// Spring 方式:IoC 解耦
@Service
public class UserService {
@Autowired
private UserDao userDao; // Spring 自动注入
public User getUser(Long id) {
return userDao.findById(id);
}
}
源码关键点:
BeanFactory是容器的核心接口,负责 Bean 的创建和管理ApplicationContext扩展了BeanFactory,提供事件发布、国际化等企业级功能DefaultListableBeanFactory是默认实现,维护beanDefinitionMap存储 Bean 定义
2. AOP 实现横切关注点分离
AOP 通过动态代理将通用逻辑(如事务、日志)从业务代码中抽离:
@Service
public class OrderService {
@Transactional // 声明式事务,无需手动编写事务代码
public void createOrder(Order order) {
// 纯业务逻辑
orderDao.save(order);
inventoryService.deduct(order.getProductId(), order.getQuantity());
}
}
实现原理:
- JDK 动态代理:为接口创建代理对象
- CGLIB 代理:为类创建子类代理
- 在方法调用前后织入增强逻辑(如开启/提交事务)
3. 生态完整性
Spring 不仅是一个 IoC 容器,更是一个完整的生态系统:
| 模块 | 功能 | 典型应用 |
|---|---|---|
| Spring MVC | Web 层框架 | RESTful API 开发 |
| Spring Data | 数据访问抽象 | JPA、MongoDB、Redis 集成 |
| Spring Security | 安全认证 | OAuth2、JWT 认证 |
| Spring Cloud | 微服务治理 | 服务注册、配置中心、网关 |
| Spring Batch | 批处理 | 大数据量的定时任务 |
性能与实践考量
1. Bean 作用域选择
不同场景选择合适的作用域可以优化性能:
@Service
@Scope("singleton") // 默认,单例共享,节省内存
public class ConfigService { }
@Component
@Scope("prototype") // 每次注入创建新实例,线程安全
public class RequestHandler { }
注意:单例 Bean 需要保证线程安全(无状态或使用 ThreadLocal)
2. 懒加载优化启动时间
@Component
@Lazy // 延迟初始化,加快应用启动
public class HeavyResourceLoader {
// 仅在首次使用时初始化
}
3. 事务传播行为
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void auditLog(String message) {
// 独立事务,即使外层事务回滚,审计日志也会提交
}
分布式场景下,单机事务无法保证跨服务一致性,需要结合分布式事务方案(如 Seata)或采用 Saga 模式、TCC 模式。
面试答题总结
为什么使用 Spring?
- IoC 解耦:通过依赖注入实现模块解耦,提升可测试性(Mock 依赖更容易)
- AOP 增强:事务、日志、权限等横切逻辑统一管理,代码更简洁
- 生态强大:从 Web 到微服务全覆盖,避免技术选型碎片化
- 社区成熟:文档完善、最佳实践丰富、问题排查效率高
关键优势:
- 降低学习成本(统一编程模型)
- 提升开发效率(约定优于配置、自动装配)
- 保障代码质量(声明式事务避免手写 try-catch-rollback)
典型场景:
- 企业级应用(ERP、CRM)需要稳定、可扩展的基础架构
- 微服务架构需要服务治理、配置管理等基础设施
- 团队协作项目需要统一编码规范和技术栈