Spring 框架核心机制深度解析【AI模型互搏生成】

news2025/5/17 11:43:37

Spring 框架核心机制深度解析(玩转开源代码)

一、Bean 生命周期全流程剖析

1.1 核心生命周期阶段

以下是 Spring Bean 生命周期核心阶段的配图,结合实际流程图示清晰展现每一步执行顺序及扩展点挂载位置。


🧬Spring Bean 生命周期流程图

graph TD
    A[加载 BeanDefinition] --> B{postProcessBeforeInstantiation?}
    B -->|是| C[返回代理对象 -> 初始化完成]
    B -->|否| D[实例化 Bean(Constructor)]
    D --> E{postProcessAfterInstantiation?}
    E -->|false| Z[终止后续流程]
    E -->|true| F[属性注入 populateBean]
    F --> G[postProcessProperties(依赖注入)]
    G --> H[执行 @Autowired/@Resource 等注解注入]
    H --> I[调用 BeanNameAware 等 Aware 接口]
    I --> J[postProcessBeforeInitialization]
    J --> K[执行初始化方法(@PostConstruct / InitializingBean)]
    K --> L[postProcessAfterInitialization]
    L --> M[注册销毁回调(DisposableBean / @PreDestroy)]
    M --> N[完成创建 -> 放入单例池]

📌 说明:

  • postProcessBeforeInstantiation:拦截实例化前,可直接返回代理跳过后续流程。
  • postProcessAfterInstantiation:控制是否进行属性注入。
  • postProcessProperties:注解驱动的依赖注入处理器(如 @Autowired)。
  • postProcessBefore/AfterInitialization:通常用于 AOP 代理封装。
  • InitializingBean/@PostConstruct:执行开发者定义的初始化逻辑。
  • 最后阶段将 Bean 放入单例池,并注册销毁逻辑。
// AbstractAutowireCapableBeanFactory.java
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, Object[] args) {
    // 1. 实例化阶段
    Object bean = instanceWrapper.getWrappedInstance();
    
    // 2. 属性填充阶段
    populateBean(beanName, mbd, instanceWrapper);
    
    // 3. 初始化阶段
    exposedObject = initializeBean(beanName, exposedObject, mbd);
    
    return exposedObject;
}

1.2 InstantiationAwareBeanPostProcessor 关键拦截点

1.2.1 实例化前拦截 (postProcessBeforeInstantiation)
// AbstractAutowireCapableBeanFactory.java
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
    if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
        for (BeanPostProcessor bp : getBeanPostProcessors()) {
            if (bp instanceof InstantiationAwareBeanPostProcessor) {
                Object result = ((InstantiationAwareBeanPostProcessor) bp)
                    .postProcessBeforeInstantiation(beanClass, beanName);
                if (result != null) {
                    // 直接返回代理对象,跳过后续标准流程
                    return applyBeanPostProcessorsAfterInitialization(result, beanName);
                }
            }
        }
        mbd.beforeInstantiationResolved = Boolean.TRUE;
    }
    return null;
}

关键特性

  • 返回非空对象会完全替代原始 Bean
  • 常用于提前生成代理(如 LoadTimeWeaving)
1.2.2 实例化后处理 (postProcessAfterInstantiation)
// AbstractAutowireCapableBeanFactory.java
protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
    boolean continueWithPropertyPopulation = true;
    for (BeanPostProcessor bp : getBeanPostProcessors()) {
        if (bp instanceof InstantiationAwareBeanPostProcessor) {
            if (!((InstantiationAwareBeanPostProcessor) bp)
                .postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                continueWithPropertyPopulation = false;
                break;
            }
        }
    }
    if (!continueWithPropertyPopulation) return;
    
    // 执行属性注入...
}

作用:控制是否进行属性注入

1.2.3 属性处理 (postProcessProperties)
// CommonAnnotationBeanPostProcessor.java
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
    // 处理 @Resource 注解注入
    InjectionMetadata metadata = findResourceMetadata(beanName, bean.getClass(), pvs);
    try {
        metadata.inject(bean, beanName, pvs);
    }
    catch (Throwable ex) {
        throw new BeanCreationException(...);
    }
    return pvs;
}

1.3 初始化阶段扩展点

回调接口执行时机典型应用场景
BeanPostProcessor初始化前后代理增强(AOP)
InitializingBean属性设置后自定义初始化逻辑
@PostConstruct初始化方法阶段生命周期回调
SmartInitializingSingleton所有单例初始化完成后应用启动后操作

二、AOP 实现机制深度解析

2.1 AOP 代理创建流程

二、AOP代理创建流程

2.1 代理创建决策流程图
graph TD
    A[创建ProxyFactory实例] --> B[设置目标对象和切面配置]
    B --> C[调用getProxy()]
    C --> D{是否设置proxyTargetClass或目标类无接口?}
    D -->|是| E{目标类是否是接口或已是代理类?}
    E -->|是| F[JDK动态代理]
    E -->|否| G[CGLIB动态代理]
    D -->|否| F
    F --> H[生成代理对象]
    G --> H

代理选择策略

  • JDK代理:要求目标类至少实现一个接口
  • CGLIB代理:通过生成子类实现代理,需注意final方法限制
  • proxyTargetClass=true 强制使用CGLIB

📌 说明:

  • ProxyFactory:核心代理工厂,封装代理创建逻辑。
  • proxyTargetClass=true 或目标类无接口:优先选择 CGLIB。
  • JDK 动态代理:代理接口,轻量高效。
  • CGLIB 代理:子类代理,适用于无接口的类。
  • AopProxy 实例:真正生成代理对象的实现类。
2.1.1 代理工厂核心配置
// ProxyFactory.java
public class ProxyFactory extends ProxyCreatorSupport {
    public Object getProxy(ClassLoader classLoader) {
        if (this.proxyInterfaces.length == 0 && !isProxyTargetClass()) {
            // 自动检测接口
            Class<?> targetClass = getTargetClass();
            if (targetClass != null) {
                setInterfaces(ClassUtils.getAllInterfacesForClass(targetClass, classLoader));
            }
        }
        
        // 创建 AopProxy 实例
        AopProxy aopProxy = createAopProxy();
        return aopProxy.getProxy(classLoader);
    }
}
2.1.2 代理类型选择策略
// DefaultAopProxyFactory.java
public AopProxy createAopProxy(AdvisedSupport config) {
    if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
        Class<?> targetClass = config.getTargetClass();
        if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
            return new JdkDynamicAopProxy(config);
        }
        return new ObjenesisCglibAopProxy(config);
    }
    else {
        return new JdkDynamicAopProxy(config);
    }
}

2.2 拦截器链执行机制(拦截器调用时序图)

Client Proxy Invocation Target Interceptor1 Interceptor2 调用方法 创建ReflectiveMethodInvocation invoke() proceed() invoke() proceed() loop [拦截器链] invokeJoinpoint() 返回结果 返回结果 返回结果 Client Proxy Invocation Target Interceptor1 Interceptor2

执行特点

  • 责任链模式实现
  • 递归调用机制(proceed()方法推动链式执行)
  • 执行顺序:前置通知 -> 目标方法 -> 后置通知(实际为嵌套执行)

📌 说明:

  • 拦截器链(Interceptor Chain):本质是一个环状递归结构,每个拦截器执行完后调用 proceed() 进入下一个。
  • ReflectiveMethodInvocation 是关键入口,按顺序调用所有增强方法。
  • 当最后一个拦截器执行完毕后,进入 invokeJoinpoint(),即目标方法本体。
  • 执行顺序符合“洋葱模型”:进入是从外到内,返回是从内到外。
2.2.1 拦截器链构建
// DefaultAdvisorChainFactory.java
public List<Object> getInterceptorsAndDynamicInterceptionAdvice(
        Advised config, Method method, Class<?> targetClass) {
    
    List<Object> interceptorList = new ArrayList<>(config.getAdvisors().length);
    for (Advisor advisor : config.getAdvisors()) {
        if (advisor instanceof PointcutAdvisor) {
            PointcutAdvisor pointcutAdvisor = (PointcutAdvisor) advisor;
            if (pointcutAdvisor.getPointcut().getClassFilter().matches(targetClass)) {
                MethodInterceptor[] interceptors = registry.getInterceptors(advisor);
                MethodMatcher mm = pointcutAdvisor.getPointcut().getMethodMatcher();
                if (MethodMatchers.matches(mm, method, targetClass, hasIntroductions)) {
                    interceptorList.addAll(Arrays.asList(interceptors));
                }
            }
        }
    }
    return interceptorList;
}
2.2.2 方法调用堆栈
// ReflectiveMethodInvocation.java
public Object proceed() throws Throwable {
    if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) {
        return invokeJoinpoint(); // 执行原始方法
    }
    
    Object interceptorOrInterceptionAdvice =
        this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex);
    
    if (interceptorOrInterceptionAdvice instanceof MethodInterceptor) {
        MethodInterceptor mi = (MethodInterceptor) interceptorOrInterceptionAdvice;
        return mi.invoke(this);
    }
    else {
        // 动态匹配处理
        return ((InterceptorAndDynamicMethodMatcher) interceptorOrInterceptionAdvice)
            .methodMatcher.matches(...) ? mi.invoke(this) : proceed();
    }
}

三、事务管理实现机制

3.1 事务传播机制实现

// AbstractPlatformTransactionManager.java
private TransactionStatus handleExistingTransaction(
        TransactionDefinition definition, Object transaction, boolean debugEnabled) {
    
    if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NEVER) {
        throw new IllegalTransactionStateException(...);
    }

    if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NOT_SUPPORTED) {
        Object suspendedResources = suspend(transaction);
        return newTransactionStatus(
            definition, null, false, newSynchronization, debugEnabled, suspendedResources);
    }
    
    if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW) {
        SuspendedResourcesHolder suspendedResources = suspend(transaction);
        return startTransaction(definition, transaction, debugEnabled, suspendedResources);
    }
    
    // 其他传播行为处理...
}

3.2 事务同步管理

// TransactionSynchronizationManager.java
public abstract class TransactionSynchronizationManager {
    private static final ThreadLocal<Map<Object, Object>> resources =
        new NamedThreadLocal<>("Transactional resources");
    
    private static final ThreadLocal<Set<TransactionSynchronization>> synchronizations =
        new NamedThreadLocal<>("Transaction synchronizations");
    
    public static void bindResource(Object key, Object value) {
        Map<Object, Object> map = resources.get();
        if (map == null) {
            map = new HashMap<>();
            resources.set(map);
        }
        Object oldValue = map.put(key, value);
        if (oldValue != null) {
            throw new IllegalStateException(...);
        }
    }
}

3.3 事务异常处理机制

// TransactionAspectSupport.java
protected void completeTransactionAfterThrowing(@Nullable TransactionInfo txInfo, Throwable ex) {
    if (txInfo != null && txInfo.getTransactionStatus() != null) {
        if (txInfo.transactionAttribute != null && txInfo.transactionAttribute.rollbackOn(ex)) {
            try {
                txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus());
            }
            catch (TransactionSystemException ex2) {
                // 处理回滚失败
            }
        }
        else {
            try {
                txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());
            }
            catch (TransactionSystemException ex2) {
                // 处理提交异常
            }
        }
    }
}

事务回滚规则矩阵

异常类型默认回滚?可配置覆盖
RuntimeException可通过 @Transactional 修改
Checked Exception可配置 rollbackFor
Error不可修改

四、核心设计模式应用

4.1 模板方法模式

  • 应用场景:AbstractAutowireCapableBeanFactory 的 createBean 方法
  • 实现方式:
    protected Object createBean(...) {
        // 前置处理
        Object bean = resolveBeforeInstantiation(...);
        if (bean != null) return bean;
        
        // 标准创建流程
        return doCreateBean(...);
    }
    
    protected abstract Object doCreateBean(...);
    

4.2 责任链模式

  • 应用场景:BeanPostProcessor 调用链、AOP 拦截器链
  • 典型实现:
    // AbstractAdvisorAutoProxyCreator.java
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        if (bean instanceof AopInfrastructureBean) {
            return bean;
        }
        return wrapIfNecessary(bean, beanName);
    }
    

4.3 代理模式

  • JDK 动态代理示例:
    public class JdkDynamicProxy implements InvocationHandler {
        private final Object target;
        
        public Object invoke(Object proxy, Method method, Object[] args) {
            // 前置处理
            Object result = method.invoke(target, args);
            // 后置处理
            return result;
        }
    }
    

五、性能优化建议

  1. Bean 生命周期优化

    • 避免在 BeanPostProcessor 中进行耗时操作
    • 合理使用 lazy-init 延迟初始化
  2. AOP 优化策略

    • 精确配置切点表达式减少匹配开销
    • 优先使用 JDK 动态代理(生成速度更快)
  3. 事务管理优化

    • 合理设置事务超时时间
    • 避免在事务方法中进行远程调用
Bean定义加载
实例化前处理
是否返回代理?
直接使用代理对象
反射实例化
属性注入
初始化前处理
执行初始化方法
初始化后处理
注册销毁方法

本解析文档结合 Spring Framework 5.3.x 版本源码实现,深入剖析了 Spring 框架的核心工作机制。建议结合官方文档和实际调试进行验证,以加深对底层原理的理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2377624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文阅读:Self-Collaboration Code Generation via ChatGPT

地址&#xff1a;Self-Collaboration Code Generation via ChatGPT 摘要 尽管大型语言模型&#xff08;LLMs&#xff09;在代码生成能力方面表现出色&#xff0c;但在处理复杂任务时仍存在挑战。在现实软件开发中&#xff0c;人类通常通过团队协作来应对复杂任务&#xff0c;…

2025年PMP 学习十五 第10章 项目资源管理

2025年PMP 学习十五 第10章 项目资源管理 序号过程过程组1规划沟通管理规划2管理沟通执行3监控沟通监控 项目沟通管理包括为确保项目的信 息及时且恰当地规划、收集、生成、发布、存储、检索、管理、控制、监 警和最终处理所需的过程&#xff1b; 项目经理绝大多数时间都用于与…

如何使用易路iBuilder智能体平台快速安全深入实现AI HR【实用帖】

随着企业组织经营对降本、增效、提质的需求日益迫切&#xff0c;越来越多企业启动人力资源数智化转型战略。而在AI战略实际推进过程中&#xff0c;企业组织往往在选型、搭建、使用、管控等问题上面临困惑&#xff1a; 如何快速、低成本接入AI能力&#xff0c;实现人力资源管理…

免费实用的远程办公方案​

假如你需要快速检索出远程电脑文件并下载&#xff1f; 假如你需要访问远程电脑的共享文件夹&#xff1f; 假如你需要访问远程电脑的USB设备&#xff0c;例如软件加密狗、调试器、固件烧录器、U盘等&#xff1f; 本篇文章能够解决以上痛点。 这个方案非常实用&#xff0c;也很…

【springboot项目服务假死、内存溢出问题排查】

问题现象&#xff1a;springboot服务A刚启动时正常&#xff0c;但运行几个小时后就会接口请求无响应&#xff0c;但服务器网络、磁盘I/O和CPU都没有出现爆满的情况&#xff0c;且A服务日志没有异常报错。 线上SpringBoot假死现象 SpringBoot应用会出现无法访问的情况。具体的表…

Java 线程状态详解:从创建到销毁的完整旅途

前言 在 Java 多线程编程中&#xff0c;线程的状态管理是理解并发逻辑的核心。本文将用通俗的语言和代码示例&#xff0c;解析线程的6种状态及其转换条件&#xff0c;助你彻底掌握线程的生命周期。 一、线程的6种状态 状态含义NEW线程对象已创建&#xff0c;但未启动&#xf…

操作系统|| 虚拟内存页置换算法

题目 写一个程序来实现 FIFO 和 LRU 页置换算法。首先&#xff0c;产生一个随机的页面引用序列&#xff0c;页面数从 0~9。将这个序列应用到每个算法并记录发生的页错误的次数。实现这个算法时要将页帧的数量设为可变。假设使用请求调页。可以参考所示的抽象类。 抽象类&…

Maven 项目构建时编译错误问题排查与解决

1. 问题描述 Maven 项目执行命令 mvn clean package 时出现编译错误&#xff0c;如下图所示 2. 问题分析 由于是源码编译错误&#xff0c;于是通过查看项目 pom.xml 文件&#xff0c;得到项目源码使用的 Java 版本为 21 <project xmlns"http://maven.apache.org/P…

安全生产调度管理系统的核心功能模块

安全生产调度管理系统是运用现代信息技术构建的智能化管理平台&#xff0c;旨在实现生产安全风险的全面管控和应急资源的优化调度。该系统通过整合物联网、大数据、人工智能等前沿技术&#xff0c;建立起覆盖风险监测、预警预测、指挥调度、决策支持的全链条安全管理体系。 一…

Linux进程信号(一)之信号的入门

文章目录 信号入门1. 生活角度的信号2. 技术应用角度的信号3. 注意4. 信号概念5.用kill -l命令可以察看系统定义的信号列表6. 信号处理常见方式 信号入门 1. 生活角度的信号 你在网上买了很多件商品&#xff0c;再等待不同商品快递的到来。但即便快递没有到来&#xff0c;你也…

基于springboot+vue的机场乘客服务系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系统展示 用户管理 航班信…

基于SpringBoot的房屋租赁管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

STM32外设AD/DA-基础及CubeMX配置

STM32外设AD/DA-基础及CubeMX配置 一&#xff0c;什么是AD/DA二&#xff0c;基础概念1&#xff0c;模拟 vs 数字2&#xff0c;AD转换1&#xff0c;分辨率 (Resolution)2&#xff0c;参考电压 (Reference Voltage, Vref)3&#xff0c;采样率 (Sampling Rate) 3&#xff0c;DA转换…

React Native简介

React Native 是由 Meta&#xff08;原 Facebook&#xff09;开源的跨平台移动应用开发框架&#xff0c;基于 React 和 JavaScript&#xff0c;允许开发者使用同一套代码库构建 iOS 和 Android 原生应用。通过 JavaScript 调用原生组件实现高性能渲染。 跨平台开发 共享 80%-9…

GCC 使用说明

参数 -fPIC ppc_85xx-gcc -shared -fPIC liberr.c -o liberr.so -fPIC 作用于编译阶段&#xff0c;告诉编译器产生与位置无关代码(Position-Independent Code)&#xff0c; 则产生的代码中&#xff0c;没有绝对地址&#xff0c;全部使用相对地址&#xff0c;故而代码可以被加…

Verilog HDL 语言整理

Verilog HDL 语言 Verilog HDL 简介 硬件描述语言Hardware Description Language是一种用形式化方法即文本形式 来描述和设计数字电路和数字系统的高级模块化语言 Verilog HDL&#xff08;Hardware Description Language&#xff09;是一种硬件描述语言&#xff0c;用于建模…

车道线检测----Lane-ATT

本文针对车道线检测----Lane-ATT论文所有细节进行阐述&#xff0c;有帮助的话点个收藏关注吧 保持对车道的关注&#xff1a;注意力引导的车道检测 摘要 但许多方法在保持实时效率方面存在问题&#xff0c;这对于自动驾驶车辆至关重要。在本文中&#xff0c;我们提出了LaneATT…

linux安装宝塔面板到数据盘

操作很简单&#xff0c;假如数据盘挂载在cipan1&#xff0c;在数据盘新建目录www&#xff0c;为了方便对应。 执行一下命令&#xff0c;创建软连接 ln -s /cipan1/www www 此时&#xff0c;根目录就出现了www文件夹 下面正常安装宝塔即可

【基础】Windows开发设置入门7:PowerShell的相关概念和使用

前言 大家熟悉的docker、Python&#xff0c;但对于Windows上有一套开配合开发的相对底层的环境设置&#xff0c;包括powershell、winget、WSL、还有开发驱动器什么的&#xff0c;我准备系统学一下&#xff0c;不然地基不牢&#xff0c;也盖不起冲天高楼~ 本节&#xff0c;介绍…

芯片生态链深度解析(一):基础材料篇——从砂砾到硅基王国的核心技术突围

【开篇&#xff1a;芯片——现代文明的“炼金术”】 当您滑动手机屏幕、驾驶新能源汽车、甚至用AI生成一幅画时&#xff0c;是否想过这些科技奇迹都始于一粒沙子&#xff1f;芯片&#xff0c;这个边长不足2厘米的黑色薄片&#xff0c;正是通过将砂砾提纯为高纯度硅锭&#xff…