Skip to content

Spring Framework 分析

本章节深入分析 Spring Framework 的源码架构、核心模块和设计思想,为 Linsir Framework 的封装提供理论基础。

分析目标

通过对 Spring Framework 源码的深入分析,达到以下目标:

  1. 理解架构设计 - 掌握 Spring 的模块化设计思想和各模块职责
  2. 学习设计模式 - 分析 Spring 中运用的经典设计模式
  3. 掌握核心机制 - 深入理解 IoC、AOP、事务等核心机制的实现原理
  4. 指导封装实践 - 基于源码分析,设计合理的封装方案

Spring Framework 版本

当前分析基于 Spring Framework 6.1.5,对应:

  • JDK 版本: 17+
  • Spring Boot: 3.2.x
  • Jakarta EE: 9+ (包名从 javax.* 改为 jakarta.*)

架构总览

Spring Framework 采用分层模块化架构,各模块职责清晰,依赖关系明确:

各核心模块职责详解

模块核心职责关键组件
spring-core基础设施层,提供工具类、资源加载、类型转换ResourceLoader, ResolvableType, Assert, ClassUtils
spring-beansIoC容器核心,Bean定义与生命周期管理BeanFactory, BeanDefinition, DefaultListableBeanFactory
spring-context应用上下文,事件、国际化、注解配置ApplicationContext, ApplicationEvent, @Configuration
spring-expressionSpEL表达式语言SpelExpressionParser, EvaluationContext
spring-aop面向切面编程AopProxy, Advisor, Pointcut, MethodInterceptor
spring-tx事务管理抽象PlatformTransactionManager, @Transactional
spring-jdbcJDBC抽象与模板JdbcTemplate, DataSourceUtils
spring-webWeb基础抽象HttpMessageConverter, RestTemplate, WebClient
spring-webmvcMVC框架实现DispatcherServlet, @Controller, HandlerMapping

模块依赖关系

核心层依赖

完整依赖图

核心设计思想

1. 控制反转 (IoC)

IoC (Inversion of Control) 是 Spring Framework 的核心理念。

传统方式:

java
public class UserService {
    private UserDao userDao = new UserDaoImpl(); // 直接依赖具体实现
}

IoC 方式:

java
public class UserService {
    private UserDao userDao; // 依赖接口,由容器注入
    
    // 通过构造器注入
    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }
}

优势:

  • 解耦组件之间的依赖关系
  • 便于单元测试
  • 支持 AOP 代理

2. 面向切面编程 (AOP)

AOP (Aspect-Oriented Programming) 将横切关注点从业务逻辑中分离。

横切关注点:

  • 事务管理
  • 日志记录
  • 权限检查
  • 性能监控

示例:

java
@Aspect
@Component
public class LoggingAspect {
    
    @Around("execution(* com.example.service.*.*(..))")
    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
        // 前置日志
        log.info("Method {} started", joinPoint.getSignature());
        
        try {
            Object result = joinPoint.proceed();
            // 后置日志
            log.info("Method {} completed", joinPoint.getSignature());
            return result;
        } catch (Exception e) {
            // 异常日志
            log.error("Method {} failed", joinPoint.getSignature(), e);
            throw e;
        }
    }
}

3. 模板方法模式

Spring 大量使用模板方法模式简化资源管理:

java
// JDBC 模板
jdbcTemplate.query("SELECT * FROM users", rs -> {
    // 处理结果集,无需关心连接关闭
});

// 事务模板
transactionTemplate.execute(status -> {
    // 执行业务逻辑,自动管理事务
    return result;
});

4. 策略模式

Spring 使用策略模式提供可插拔的实现:

java
// 资源加载策略
ResourceLoader loader = new DefaultResourceLoader();
Resource resource = loader.getResource("classpath:config.xml");

// 视图解析策略
ViewResolver resolver = new InternalResourceViewResolver();
View view = resolver.resolveViewName("home", Locale.CHINA);

核心接口设计

1. BeanFactory 体系

2. ApplicationContext 体系

3. 事务管理器体系

设计模式总结

设计模式应用场景Spring 中的示例
工厂模式创建复杂对象BeanFactory, FactoryBean
单例模式确保只有一个实例Spring 的 Singleton Bean
代理模式AOP 实现JdkDynamicAopProxy, CglibAopProxy
模板方法定义算法骨架JdbcTemplate, TransactionTemplate
策略模式可替换算法ResourceLoader, ViewResolver
观察者模式事件驱动ApplicationEvent, ApplicationListener
适配器模式接口转换HandlerAdapter, AdvisorAdapter
装饰器模式动态增强TransactionAwareDataSourceProxy

扩展机制

1. BeanPostProcessor

在 Bean 初始化前后进行自定义处理:

java
public interface BeanPostProcessor {
    default Object postProcessBeforeInitialization(Object bean, String beanName) {
        return bean;
    }
    
    default Object postProcessAfterInitialization(Object bean, String beanName) {
        return bean;
    }
}

2. BeanFactoryPostProcessor

在 BeanFactory 创建后、Bean 实例化前进行自定义处理:

java
@FunctionalInterface
public interface BeanFactoryPostProcessor {
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory);
}

3. ApplicationListener

监听应用事件:

java
@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> {
    void onApplicationEvent(E event);
}

分析内容

核心模块源码分析

核心机制分析

  • IoC 容器启动流程
  • Bean 生命周期管理
  • 依赖注入实现原理
  • AOP 代理机制
  • 事务传播机制
  • 事件驱动机制

学习方法

1. 自上而下

先理解整体架构,再深入具体模块,最后分析核心类。

2. 带着问题阅读

  • 这个模块解决什么问题?
  • 核心接口是什么?有哪些实现?
  • 使用了哪些设计模式?
  • 如何扩展和定制?

3. 结合实践

  • 编写测试用例验证理解
  • 绘制类图和时序图
  • 总结核心流程

参考资源

下一步

基于 Apache 2.0 许可发布