当前位置: 首页 > article >正文

Sprinig源码解析

前言

  Spring 框架是 Java 企业级开发的基石,其源码设计体现了模块化、扩展性和灵活性。以下从 IoC 容器、AOP 实现、核心模块和关键设计模式四个角度对 Spring 源码进行深度解析,帮助理解其底层机制。即使Spring会使用的人见得就能使用。

一、IoC 容器源码解析

  IoC(控制反转)是 Spring 的核心,其核心接口是 BeanFactory 和 ApplicationContext。

1.1. Bean 的生命周期

  Spring 管理 Bean 的完整生命周期,关键步骤如下:
1.Bean 定义加载:

  • 通过 BeanDefinitionReader(如 XmlBeanDefinitionReader)读取 XML 或注解配置,解析为 BeanDefinition 对象。
    2.Bean 实例化:
  • 调用 InstantiationStrategy(默认 CglibSubclassingInstantiationStrategy)创建 Bean 实例。
  • 反射或 CGLIB 动态生成子类(用于处理构造方法注入或 AOP 代理)。
    3.依赖注入:
  • 通过 AutowiredAnnotationBeanPostProcessor 处理 @Autowired 注解。
  • 使用 CommonAnnotationBeanPostProcessor 处理 @Resource 等 JSR-250 注解。
    4.初始化:
  • 调用 InitializingBean.afterPropertiesSet() 或自定义 init-method。
  • 应用 BeanPostProcessor.postProcessBeforeInitialization() 和 postProcessAfterInitialization()。
    5.销毁:
  • 调用 DisposableBean.destroy() 或自定义 destroy-method。

1.2. BeanFactory 与 ApplicationContext

  • BeanFactory:
  • 基础容器接口(DefaultListableBeanFactory 是默认实现)。
  • 延迟加载 Bean,首次调用 getBean() 时实例化。
    ApplicationContext:
  • 扩展自 BeanFactory,提供企业级功能(国际化、事件发布、资源加载等)。
  • 默认在启动时预初始化所有单例 Bean(通过 AbstractApplicationContext.refresh())。

1.3. 源码流程示例

// 核心入口:AbstractApplicationContext.refresh()
public void refresh() {
    // 1. 加载 BeanDefinition
    obtainFreshBeanFactory();
    // 2. 调用 BeanFactoryPostProcessor
    invokeBeanFactoryPostProcessors();
    // 3. 注册 BeanPostProcessor
    registerBeanPostProcessors();
    // 4. 初始化单例 Bean
    finishBeanFactoryInitialization(beanFactory);
}

二、AOP 实现源码解析

Spring AOP 基于动态代理实现,支持 JDK 动态代理和 CGLIB。

2.1. AOP 核心组件

  • Pointcut:定义切点(哪些方法需要被增强)。
  • Advice:定义增强逻辑(前置、后置、环绕等)。
  • Advisor:组合 Pointcut 和 Advice。
  • AopProxy:生成代理对象的接口(JdkDynamicAopProxy 或 ObjenesisCglibAopProxy)。

2.2. 代理创建流程

  1.在 Bean 初始化阶段,AbstractAutoProxyCreator(实现 BeanPostProcessor)拦截 Bean 的创建。
  2.根据 Pointcut 匹配 Bean 的方法,生成代理对象。
  3.调用代理对象的方法时,触发 MethodInterceptor 链式执行。

2.3. 源码示例

// JdkDynamicAopProxy 的 invoke() 方法
public Object invoke(Object proxy, Method method, Object[] args) {
    // 获取拦截器链
    List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);
    // 创建 MethodInvocation 并执行
    MethodInvocation invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);
    return invocation.proceed();
}

三、核心模块解析

3.1. 事务管理(@Transactional)

  • 实现原理:

    • 通过 TransactionInterceptor 拦截方法调用。
    • 使用 PlatformTransactionManager(如 DataSourceTransactionManager)管理事务。
  • 关键代码:

// TransactionAspectSupport.invokeWithinTransaction()
protected Object invokeWithinTransaction(Method method, Class<?> targetClass, final InvocationCallback invocation) {
    TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
    try {
        Object result = invocation.proceedWithInvocation();
        commitTransactionAfterReturning(txInfo);
        return result;
    } catch (Throwable ex) {
        completeTransactionAfterThrowing(txInfo, ex);
        throw ex;
    }
}

3.2. 事件机制(ApplicationEvent)

  • 核心类:

    • ApplicationEventPublisher:发布事件。
    • ApplicationListener:监听事件。
  • 流程:

    • 调用 publishEvent() 发布事件。
    • 通过 SimpleApplicationEventMulticaster 广播事件到所有匹配的监听器。

3.3. SpEL(Spring Expression Language)

  • 解析流程:
    • 使用 SpelExpressionParser 解析表达式。
    • 通过 StandardEvaluationContext 提供上下文变量。

四、关键设计模式

  1. 模板方法模式
  • 应用场景:AbstractApplicationContext.refresh() 定义了容器初始化的骨架,子类可重写特定步骤(如 AnnotationConfigWebApplicationContext)。
  • 示例代码:
public abstract class AbstractApplicationContext {
    public void refresh() {
        // 模板方法
        obtainFreshBeanFactory();
        prepareBeanFactory(beanFactory);
        postProcessBeanFactory(beanFactory);
        // ...
    }
}
  1. 工厂模式
  • 应用场景:BeanFactory 是工厂接口,DefaultListableBeanFactory 是具体实现。
  1. 代理模式
  • 应用场景:AOP 动态代理、ProxyFactoryBean 创建代理对象。
  1. 观察者模式
  • 应用场景:事件发布与监听机制。

五、调试 Spring 源码的建议

1.入口示例:

// 基于注解的容器初始化
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = context.getBean(UserService.class);
userService.save();

2.关键断点:

  • AbstractApplicationContext.refresh():容器初始化的核心入口。
  • AbstractAutowireCapableBeanFactory.createBean():Bean 实例化的关键逻辑。
  • JdkDynamicAopProxy.invoke():AOP 代理方法调用。
  • TransactionInterceptor.invoke():事务管理的拦截逻辑。

六、Spring 源码设计哲学

  1.开闭原则:通过扩展点(如 BeanPostProcessor)支持功能扩展,无需修改核心代码。

  2.单一职责:模块高度解耦(如 BeanFactory 负责 Bean 管理,ApplicationContext 提供企业级功能)。

  3.约定优于配置:通过默认配置减少用户工作量(如自动扫描 @Component 注解)。

总结

  Spring源码通过模块化设计和经典设计模式实现了高度灵活性和扩展性:

  • IoC 容器:以 BeanFactory 为核心,通过 BeanDefinition 和 BeanPostProcessor 管理 Bean 生命周期。
  • AOP:基于动态代理和拦截器链实现切面编程。
  • 事务与事件:通过拦截器和观察者模式提供企业级功能。
  • 扩展机制:开放 BeanFactoryPostProcessor、BeanPostProcessor 等扩展点。

  深入Spring源码不仅能帮助解决实际开发中的复杂问题(如性能优化、定制化需求),还能提升对框架设计思想的理解,为开发高质量应用奠定基础。


http://www.kler.cn/a/546941.html

相关文章:

  • [LeetCode]day21 15.三数之和
  • Machine Learning:Optimization
  • H5自适应响应式代理记账与财政咨询服务类PbootCMS网站模板 – HTML5财务会计类网站源码下载
  • HCIA项目实践---OSPF的基本配置
  • 在本地校验密码或弱口令 (windows)
  • DeepSeek免费部署到WPS或Office
  • Linux 内核 IPoIB 驱动中 sysfs 属性冲突问题的分析与解决
  • LAWS是典型的人机环境系统
  • 【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)— 4.6 RNN与LSTM的变体与发展趋势】
  • Unity使用iTextSharp导出PDF-04图形
  • 修改OnlyOffice编辑器默认字体
  • 小米 R3G 路由器刷机教程(Pandavan)
  • 算法练习——哈希表
  • QML使用ChartView绘制箱线图
  • harmonyOS的文件的增、删、读、写相关操作(fs/content)
  • 土星云边缘计算微服务器 SE110S-WA32加持DeepSeek,本地部署企业私有推理大模型!
  • 父组件中循环子组件调用
  • Vue的学习(5)
  • Microsoft Edge浏览器介绍
  • kubekey一键部署k8s高可用与kubesphere