Spring内核探秘:从BeanDefinition到完整Bean的涅槃之旅

本文不满足于表面使用,将直击Spring框架的核心——IoC容器,通过源码逐层剖析,揭示其背后的设计精妙与实现原理。

一、Spring IoC容器总体架构:设计蓝图

在深入代码之前,必须先理解Spring IoC容器的顶层设计。整个容器体系围绕BeanFactory这一核心接口构建,其核心继承体系如下:

// 核心接口继承链
BeanFactory → ListableBeanFactory → ConfigurableBeanFactory 
           → HierarchicalBeanFactory → ApplicationContext

1.1 核心接口职责分离

public interface BeanFactory {
    // 1. 基础Bean获取能力
    Object getBean(String name) throws BeansException;
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;
    
    // 2. 类型检查与作用域判断
    boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
}

public interface ListableBeanFactory extends BeanFactory {
    // 3. 批量Bean查询能力
    String[] getBeanDefinitionNames();
    <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException;
}

public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {
    // 4. 容器配置能力
    void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
    void registerScope(String scopeName, Scope scope);
    void destroySingletons();
}

设计哲学:通过精细的接口拆分,实现了"单一职责原则",每个接口只关注特定方面的功能,使得整个架构高度可扩展。

二、BeanDefinition:Bean的"蓝图"

在Spring中,Bean并不是直接创建的,而是先通过BeanDefinition来描述Bean的元数据。

2.1 BeanDefinition核心结构

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
    
    // 作用域常量
    String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
    String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
    
    // Bean类信息
    void setBeanClassName(String beanClassName);
    String getBeanClassName();
    
    // 作用域控制
    void setScope(String scope);
    String getScope();
    
    // 生命周期配置
    void setLazyInit(boolean lazyInit);
    boolean isLazyInit();
    
    void setInitMethodName(String initMethodName);
    String getInitMethodName();
    
    // 依赖关系
    void setDependsOn(String... dependsOn);
    String[] getDependsOn();
    
    // 是否是主要候选者(@Primary)
    void setPrimary(boolean primary);
    boolean isPrimary();
}

2.2 BeanDefinition的注册过程

让我们跟踪ClassPathXmlApplicationContext的启动过程:

public class ClassPathXmlApplicationContext extends AbstractXmlApplicationContext {
    
    public ClassPathXmlApplicationContext(String[] configLocations) {
        // 核心启动流程
        this(configLocations, true, null);
    }
    
    public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, 
                                         ApplicationContext parent) {
        super(parent);
        setConfigLocations(configLocations);
        if (refresh) {
            // 这是整个Spring容器启动的核心入口!
            refresh();
        }
    }
}

三、refresh()方法:容器启动的生命线

AbstractApplicationContext.refresh()是Spring容器启动的核心流程,理解它就理解了Spring的整个生命周期。

3.1 refresh()方法完整流程

@Override
public void refresh() throws BeansException, IllegalStateException {
    synchronized (this.startupShutdownMonitor) {
        // 1. 准备刷新上下文
        prepareRefresh();
        
        // 2. 初始化BeanFactory并加载BeanDefinitions(关键步骤!)
        ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
        
        // 3. 配置BeanFactory(设置类加载器、SPEL解析器等)
        prepareBeanFactory(beanFactory);
        
        try {
            // 4. 后处理BeanFactory(留给子类扩展)
            postProcessBeanFactory(beanFactory);
            
            // 5. 调用BeanFactoryPostProcessors(关键扩展点!)
            invokeBeanFactoryPostProcessors(beanFactory);
            
            // 6. 注册BeanPostProcessors(Bean后处理器)
            registerBeanPostProcessors(beanFactory);
            
            // 7. 初始化消息源(国际化)
            initMessageSource();
            
            // 8. 初始化应用事件广播器
            initApplicationEventMulticaster();
            
            // 9. 留给子类扩展的onRefresh方法
            onRefresh();
            
            // 10. 注册监听器
            registerListeners();
            
            // 11. 完成BeanFactory初始化,实例化所有非懒加载单例(关键步骤!)
            finishBeanFactoryInitialization(beanFactory);
            
            // 12. 完成刷新,发布相应事件
            finishRefresh();
        } catch (BeansException ex) {
            // 13. 销毁已创建的Bean
            destroyBeans();
            // 14. 重置激活标志
            cancelRefresh(ex);
            throw ex;
        } finally {
            // 15. 重置Spring核心中的公共内省缓存
            resetCommonCaches();
        }
    }
}

3.2 关键步骤深度解析:BeanDefinition加载

让我们深入第2步obtainFreshBeanFactory()

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
    // 1. 刷新BeanFactory
    refreshBeanFactory();
    // 2. 返回刷新后的BeanFactory
    return getBeanFactory();
}

// 在AbstractRefreshableApplicationContext中的实现
@Override
protected final void refreshBeanFactory() throws BeansException {
    if (hasBeanFactory()) {
        destroyBeans();
        closeBeanFactory();
    }
    try {
        // 创建新的BeanFactory(默认是DefaultListableBeanFactory)
        DefaultListableBeanFactory beanFactory = createBeanFactory();
        beanFactory.setSerializationId(getId());
        
        // 定制BeanFactory(设置是否允许覆盖、循环依赖等)
        customizeBeanFactory(beanFactory);
        
        // 加载BeanDefinitions(这是模板方法,由子类实现)
        loadBeanDefinitions(beanFactory);
        
        this.beanFactory = beanFactory;
    } catch (IOException ex) {
        throw new ApplicationContextException("I/O error parsing bean definition source", ex);
    }
}

四、Bean创建过程:从定义到实例的涅槃

第11步finishBeanFactoryInitialization(beanFactory)是Bean实例化的核心:

4.1 Bean创建时序图

getBean() → doGetBean() → createBean() → doCreateBean()
    ↓
resolveBeanClass() → instantiateBean() → populateBean() → initializeBean()

4.2 核心源码解析

// AbstractBeanFactory
protected <T> T doGetBean(String name, Class<T> requiredType, 
                         Object[] args, boolean typeCheckOnly) {
    
    // 1. 转换Bean名称(处理FactoryBean、别名等)
    String beanName = transformedBeanName(name);
    
    // 2. 尝试从缓存中获取单例
    Object sharedInstance = getSingleton(beanName);
    if (sharedInstance != null && args == null) {
        return getObjectForBeanInstance(sharedInstance, name, beanName, null);
    }
    
    // 3. 检查BeanDefinition是否存在
    BeanDefinition bd = getMergedBeanDefinition(beanName);
    
    // 4. 处理依赖的Bean(depends-on)
    String[] dependsOn = bd.getDependsOn();
    if (dependsOn != null) {
        for (String dep : dependsOn) {
            // 递归初始化依赖的Bean
            getBean(dep);
            registerDependentBean(dep, beanName);
        }
    }
    
    // 5. 根据作用域创建Bean实例
    if (bd.isSingleton()) {
        sharedInstance = getSingleton(beanName, () -> {
            try {
                return createBean(beanName, bd, args);
            } catch (BeansException ex) {
                destroySingleton(beanName);
                throw ex;
            }
        });
        return getObjectForBeanInstance(sharedInstance, name, beanName, bd);
    } else if (bd.isPrototype()) {
        // 原型模式每次都创建新实例
        Object prototypeInstance = createBean(beanName, bd, args);
        return getObjectForBeanInstance(prototypeInstance, name, beanName, bd);
    } else {
        // 其他作用域(request、session等)
        String scopeName = bd.getScope();
        Scope scope = this.scopes.get(scopeName);
        Object scopedInstance = scope.get(beanName, () -> {
            return createBean(beanName, bd, args);
        });
        return getObjectForBeanInstance(scopedInstance, name, beanName, bd);
    }
}

4.3 createBean的真正实现

// AbstractAutowireCapableBeanFactory
@Override
protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) {
    
    // 1. 解析Bean类
    Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
    
    // 2. 准备方法覆盖(lookup-method, replace-method)
    mbdToUse.prepareMethodOverrides();
    
    // 3. 给BeanPostProcessors机会返回代理而不是目标Bean(AOP的关键!)
    Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
    if (bean != null) {
        return bean;
    }
    
    // 4. 真正的创建Bean实例
    return doCreateBean(beanName, mbdToUse, args);
}

protected Object doCreateBean(String beanName, RootBeanDefinition mbd, Object[] args) {
    BeanWrapper instanceWrapper = null;
    
    // 4.1 实例化Bean(调用构造方法)
    if (mbd.isSingleton()) {
        instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
    }
    if (instanceWrapper == null) {
        instanceWrapper = createBeanInstance(beanName, mbd, args);
    }
    
    // 4.2 应用MergedBeanDefinitionPostProcessors(@Autowired注解在这里处理)
    applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
    
    // 4.3 属性填充(依赖注入!)
    populateBean(beanName, mbd, instanceWrapper);
    
    // 4.4 初始化Bean
    Object exposedObject = initializeBean(beanName, exposedObject, mbd);
    
    return exposedObject;
}

五、依赖注入:@Autowired的实现原理

让我们深入populateBean方法,看看Spring是如何实现依赖注入的:

5.1 自动装配的核心逻辑

protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
    
    // 1. 如果有属性值,先设置属性值
    PropertyValues pvs = mbd.getPropertyValues();
    
    // 2. 调用InstantiationAwareBeanPostProcessors(在设置属性之前)
    if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
        for (BeanPostProcessor bp : getBeanPostProcessors()) {
            if (bp instanceof InstantiationAwareBeanPostProcessor) {
                InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                    return;
                }
            }
        }
    }
    
    // 3. 自动装配ByName和ByType
    if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME || 
        mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
        
        MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
        
        // 根据名称自动装配
        if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME) {
            autowireByName(beanName, mbd, bw, newPvs);
        }
        
        // 根据类型自动装配
        if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
            autowireByType(beanName, mbd, bw, newPvs);
        }
        
        pvs = newPvs;
    }
    
    // 4. 调用InstantiationAwareBeanPostProcessors的postProcessProperties方法
    // 这里就是@Autowired注解处理的地方!
    if (hasInstantiationAwareBeanPostProcessors()) {
        for (BeanPostProcessor bp : getBeanPostProcessors()) {
            if (bp instanceof InstantiationAwareBeanPostProcessor) {
                InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
                if (pvsToUse == null) {
                    // 兼容老版本
                    pvsToUse = ibp.postProcessPropertyValues(pvs, 
                        filteredPds, bw.getWrappedInstance(), beanName);
                }
                if (pvsToUse != null) {
                    pvs = pvsToUse;
                }
            }
        }
    }
    
    // 5. 应用属性值
    applyPropertyValues(beanName, mbd, bw, pvs);
}

5.2 @Autowired注解处理器

AutowiredAnnotationBeanPostProcessor是处理@Autowired注解的核心类:

public class AutowiredAnnotationBeanPostProcessor implements 
        InstantiationAwareBeanPostProcessor, MergedBeanDefinitionPostProcessor {
    
    // 1. 后处理合并的BeanDefinition,查找所有需要自动装配的元数据
    @Override
    public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, 
                                              Class<?> beanType, String beanName) {
        // 查找被@Autowired注解的字段和方法
        InjectionMetadata metadata = findAutowiringMetadata(beanName, beanType, null);
        metadata.checkConfigMembers(beanDefinition);
    }
    
    // 2. 属性填充阶段进行依赖注入
    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
        // 获取注入元数据
        InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);
        try {
            // 进行注入!
            metadata.inject(bean, beanName, pvs);
        } catch (Throwable ex) {
            throw new BeanCreationException(beanName, "Injection of autowired dependencies failed", ex);
        }
        return pvs;
    }
    
    // 3. 构建注入元数据
    private InjectionMetadata findAutowiringMetadata(String beanName, Class<?> clazz, 
                                                   PropertyValues pvs) {
        String cacheKey = (StringUtils.hasLength(beanName) ? beanName : clazz.getName());
        return this.injectionMetadataCache.computeIfAbsent(cacheKey, k -> {
            // 反射查找被@Autowired注解的字段和方法
            List<InjectionMetadata.InjectedElement> elements = new ArrayList<>();
            Class<?> targetClass = clazz;
            
            do {
                List<InjectionMetadata.InjectedElement> currElements = new ArrayList<>();
                
                // 处理字段
                ReflectionUtils.doWithLocalFields(targetClass, field -> {
                    AnnotationAttributes ann = findAutowiredAnnotation(field);
                    if (ann != null) {
                        if (Modifier.isStatic(field.getModifiers())) {
                            return; // 静态字段不注入
                        }
                        boolean required = determineRequiredStatus(ann);
                        currElements.add(new AutowiredFieldElement(field, required));
                    }
                });
                
                // 处理方法
                ReflectionUtils.doWithLocalMethods(targetClass, method -> {
                    Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method);
                    AnnotationAttributes ann = findAutowiredAnnotation(bridgedMethod);
                    if (ann != null && method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) {
                        if (Modifier.isStatic(method.getModifiers())) {
                            return; // 静态方法不注入
                        }
                        if (method.getParameterCount() == 0) {
                            return; // 无参数方法不处理
                        }
                        boolean required = determineRequiredStatus(ann);
                        PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz);
                        currElements.add(new AutowiredMethodElement(method, required, pd));
                    }
                });
                
                elements.addAll(0, currElements);
                targetClass = targetClass.getSuperclass();
            } while (targetClass != null && targetClass != Object.class);
            
            return new InjectionMetadata(clazz, elements);
        });
    }
}

六、循环依赖:Spring的三级缓存解决方案

Spring通过三级缓存巧妙地解决了单例Bean的循环依赖问题:

6.1 三级缓存定义

public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
    
    // 一级缓存:存放完全初始化好的Bean
    private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
    
    // 二级缓存:存放早期暴露的Bean(已实例化但未填充属性)
    private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16);
    
    // 三级缓存:存放Bean工厂,用于生成早期引用
    private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
    
    // 正在创建中的Bean
    private final Set<String> singletonsCurrentlyInCreation = 
        Collections.newSetFromMap(new ConcurrentHashMap<>(16));
}

6.2 循环依赖解决流程

protected Object getSingleton(String beanName, boolean allowEarlyReference) {
    // 1. 从一级缓存查找
    Object singletonObject = this.singletonObjects.get(beanName);
    if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
        synchronized (this.singletonObjects) {
            // 2. 从二级缓存查找
            singletonObject = this.earlySingletonObjects.get(beanName);
            if (singletonObject == null && allowEarlyReference) {
                // 3. 从三级缓存获取ObjectFactory
                ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
                if (singletonFactory != null) {
                    // 4. 调用getObject方法获取早期引用(可能经过AOP代理)
                    singletonObject = singletonFactory.getObject();
                    // 5. 放入二级缓存,清除三级缓存
                    this.earlySingletonObjects.put(beanName, singletonObject);
                    this.singletonFactories.remove(beanName);
                }
            }
        }
    }
    return singletonObject;
}

七、设计模式在Spring源码中的应用

Spring源码是设计模式应用的典范:

7.1 模板方法模式

AbstractApplicationContext.refresh()方法定义了容器启动的整体流程,具体步骤由子类实现。

7.2 工厂模式

BeanFactory是典型的工厂模式,隐藏了Bean创建的复杂细节。

7.3 策略模式

InstantiationStrategy定义了Bean实例化的策略,SimpleInstantiationStrategyCglibSubclassingInstantiationStrategy是不同的实现。

7.4 观察者模式

Spring的事件机制ApplicationEventApplicationListener是观察者模式的典型应用。

总结

通过深度剖析Spring IoC容器的源码,我们可以得出以下核心理解:

  1. BeanDefinition是基石:所有的Bean创建都基于BeanDefinition的元数据。
  2. refresh()是生命线:理解这个方法就理解了Spring容器的完整生命周期。
  3. BeanPostProcessor是扩展点:Spring的AOP、事务、异步等特性都通过BeanPostProcessor实现。
  4. 三级缓存解决循环依赖:这是Spring框架设计精妙的集中体现。
  5. 接口驱动设计:精细的接口划分使得Spring框架高度可扩展。

理解Spring源码不仅能够帮助我们更好地使用Spring,更重要的是能够学习到优秀框架的设计思想和架构模式,这对于提升我们的系统设计能力有着不可估量的价值。

希望这篇深度源码解析能够帮助您真正理解Spring框架的精髓!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容