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

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 放入单例池,并注册销毁逻辑。
java 复制代码
// 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)
java 复制代码
// 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)
java 复制代码
// 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)
java 复制代码
// 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 代理工厂核心配置
java 复制代码
// 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 代理类型选择策略
java 复制代码
// 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 拦截器链构建
java 复制代码
// 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 方法调用堆栈
java 复制代码
// 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 事务传播机制实现

java 复制代码
// 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 事务同步管理

java 复制代码
// 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 事务异常处理机制

java 复制代码
// 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 方法

  • 实现方式:

    java 复制代码
    protected Object createBean(...) {
        // 前置处理
        Object bean = resolveBeforeInstantiation(...);
        if (bean != null) return bean;
        
        // 标准创建流程
        return doCreateBean(...);
    }
    
    protected abstract Object doCreateBean(...);

4.2 责任链模式

  • 应用场景:BeanPostProcessor 调用链、AOP 拦截器链

  • 典型实现:

    java 复制代码
    // AbstractAdvisorAutoProxyCreator.java
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        if (bean instanceof AopInfrastructureBean) {
            return bean;
        }
        return wrapIfNecessary(bean, beanName);
    }

4.3 代理模式

  • JDK 动态代理示例:

    java 复制代码
    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 框架的核心工作机制。建议结合官方文档和实际调试进行验证,以加深对底层原理的理解。

相关推荐
江-小北26 分钟前
10万字86道Java多线程经典面试题(2025修订版)
java·java面试题·java并发面试题·java多线程面试题
Hygge-star26 分钟前
【算法】定长滑动窗口5.20
java·数据结构·算法·学习方法·代码规范
鸠。38 分钟前
苍穹外卖04 新增菜品&&菜品分页查询&删除菜品&修改菜品
java
xxjiaz1 小时前
移除链表元素--LeetCode
java·算法·leetcode·链表
洛_尘2 小时前
Java EE进阶1:导读
java·java-ee
老马啸西风2 小时前
工作流引擎-01-Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎,支持现实世界的流程自动化需求
java·开源·自动化·activiti·workflow·flowable·bpm
不会写代码的女程序猿2 小时前
基于Spring Boot+Layui构建企业级电子招投标系统实战指南
java·企业招投标系统源码·招投标系统
asom222 小时前
Java 05正则表达式
java·正则表达式
qq_2518364573 小时前
基于springboot3 VUE3 火车订票系统前后端分离项目适合新手学习的项目包含 智能客服 换乘算法
java·开发语言·spring boot·后端·学习
supingemail3 小时前
Spring Boot 的高级特性与经典的设计模式应用
spring boot·后端·设计模式