核心概念

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?

  1. IoC 解耦:通过依赖注入实现模块解耦,提升可测试性(Mock 依赖更容易)
  2. AOP 增强:事务、日志、权限等横切逻辑统一管理,代码更简洁
  3. 生态强大:从 Web 到微服务全覆盖,避免技术选型碎片化
  4. 社区成熟:文档完善、最佳实践丰富、问题排查效率高

关键优势

  • 降低学习成本(统一编程模型)
  • 提升开发效率(约定优于配置、自动装配)
  • 保障代码质量(声明式事务避免手写 try-catch-rollback)

典型场景

  • 企业级应用(ERP、CRM)需要稳定、可扩展的基础架构
  • 微服务架构需要服务治理、配置管理等基础设施
  • 团队协作项目需要统一编码规范和技术栈