史上最详细Spring IOC源码解析(Spring Framework 5.3.x)

一、IOC容器概述

Spring IOC容器的本质是一个管理POJO对象生命周期的工厂系统,其核心实现位于org.springframework.beansorg.springframework.context包。本节将深入分析BeanFactoryApplicationContext两大核心接口的源码差异。

1.1 BeanFactory源码层级

public interface BeanFactory {
    // 核心方法定义(部分)
    Object getBean(String name) throws BeansException;
    <T> T getBean(Class<T> requiredType) throws BeansException;
    boolean containsBean(String name);
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
    // 层级关系:通过HierarchicalBeanFactory实现父子容器
}

关键实现类DefaultListableBeanFactory的类继承关系:

BeanFactory ← ListableBeanFactory ← ConfigurableBeanFactory
           ← AutowireCapableBeanFactory ← AbstractBeanFactory
           ← DefaultListableBeanFactory

1.2 ApplicationContext的增强
ApplicationContext通过组合模式集成多个功能接口:

public interface ApplicationContext extends EnvironmentCapable, 
    ListableBeanFactory, HierarchicalBeanFactory,
    MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
    // 扩展方法如getEnvironment(), publishEvent()等
}

典型实现类AnnotationConfigApplicationContext的类结构包含:

  • GenericApplicationContext:基础容器

  • AnnotationConfigRegistry:注解配置支持

  • BeanDefinitionRegistry:Bean定义注册能力


二、容器启动全流程源码分析

AnnotationConfigApplicationContext为例,分析容器初始化过程:

2.1 构造方法调用链

public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
    this();
    register(componentClasses);
    refresh(); // 核心方法!!!
}

// 分解refresh()方法(AbstractApplicationContext类)
public void refresh() throws BeansException, IllegalStateException {
    synchronized (this.startupShutdownMonitor) {
        // 1. 准备阶段
        prepareRefresh();

        // 2. 获取BeanFactory(关键!)
        ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

        // 3. BeanFactory预处理
        prepareBeanFactory(beanFactory);

        try {
            // 4. 后置处理(空实现,留给子类扩展)
            postProcessBeanFactory(beanFactory);

            // 5. 执行BeanFactoryPostProcessor
            invokeBeanFactoryPostProcessors(beanFactory);

            // 6. 注册BeanPostProcessor
            registerBeanPostProcessors(beanFactory);

            // 7. 初始化消息源
            initMessageSource();

            // 8. 初始化事件广播器
            initApplicationEventMulticaster();

            // 9. 子类扩展(如Web应用的Context刷新)
            onRefresh();

            // 10. 注册监听器
            registerListeners();

            // 11. 完成Bean初始化(重点!)
            finishBeanFactoryInitialization(beanFactory);

            // 12. 完成刷新
            finishRefresh();
        }
        // ... 异常处理
    }
}

2.2 BeanDefinition加载过程
ConfigurationClassPostProcessor为例解析@Configuration类:

// ConfigurationClassPostProcessor.processConfigBeanDefinitions()
public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
    // 1. 解析@Configuration类
    ConfigurationClassParser parser = new ConfigurationClassParser(...);
    parser.parse(candidates);

    // 2. 加载@Bean方法生成的BeanDefinition
    this.reader.loadBeanDefinitions(configClasses);
}

2.3 finishBeanFactoryInitialization详解

// DefaultListableBeanFactory.preInstantiateSingletons()
public void preInstantiateSingletons() throws BeansException {
    List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
    for (String beanName : beanNames) {
        RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
        if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
            // 触发Bean实例化
            getBean(beanName);
        }
    }
}

三、Bean生命周期源码深度剖析

跟踪getBean()方法的完整调用链:

3.1 实例化阶段

// AbstractAutowireCapableBeanFactory.createBean()
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
    // 1. 解析Bean类
    Class<?> resolvedClass = resolveBeanClass(mbd, beanName);

    // 2. 处理lookup-method和replace-method
    mbd.prepareMethodOverrides();

    // 3. 应用BeanPostProcessor(前置处理)
    Object bean = resolveBeforeInstantiation(beanName, mbd);
    if (bean != null) return bean;

    // 4. 真正创建Bean实例
    Object beanInstance = doCreateBean(beanName, mbd, args);
    return beanInstance;
}

3.2 属性注入(populateBean)

protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
    // 1. 应用InstantiationAwareBeanPostProcessor
    if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
        for (BeanPostProcessor bp : getBeanPostProcessors()) {
            if (bp instanceof InstantiationAwareBeanPostProcessor) {
                // 执行@Autowired等注解处理
            }
        }
    }

    // 2. 按类型自动装配
    if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
        autowireByType(beanName, mbd, bw, newPvs);
    }
}

3.3 初始化阶段

// AbstractAutowireCapableBeanFactory.initializeBean()
protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
    // 1. 调用Aware接口
    invokeAwareMethods(beanName, bean);

    // 2. 应用BeanPostProcessor前置处理
    wrappedBean = applyBeanPostProcessorsBeforeInitialization(bean, beanName);

    // 3. 调用init方法
    invokeInitMethods(beanName, wrappedBean, mbd);

    // 4. 应用BeanPostProcessor后置处理(AOP代理在此发生!)
    wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

    return wrappedBean;
}

四、循环依赖解决机制

Spring通过三级缓存解决循环依赖问题,核心代码位于DefaultSingletonBeanRegistry

4.1 三级缓存定义

// 一级缓存:完整Bean实例
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

// 二级缓存:早期暴露对象(未完成属性注入)
private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<>(16);

// 三级缓存:ObjectFactory(用于生成代理对象)
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);

4.2 getBean()中的处理流程

protected Object getSingleton(String beanName, boolean allowEarlyReference) {
    Object singletonObject = this.singletonObjects.get(beanName);
    if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
        synchronized (this.singletonObjects) {
            singletonObject = this.earlySingletonObjects.get(beanName);
            if (singletonObject == null && allowEarlyReference) {
                ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
                if (singletonFactory != null) {
                    singletonObject = singletonFactory.getObject();
                    this.earlySingletonObjects.put(beanName, singletonObject);
                    this.singletonFactories.remove(beanName);
                }
            }
        }
    }
    return singletonObject;
}

4.3 addSingletonFactory()关键方法

protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
    synchronized (this.singletonObjects) {
        if (!this.singletonObjects.containsKey(beanName)) {
            this.singletonFactories.put(beanName, singletonFactory);
            this.earlySingletonObjects.remove(beanName);
            this.registeredSingletons.add(beanName);
        }
    }
}

五、设计模式在IOC中的运用
  1. 工厂模式:BeanFactory作为顶层工厂接口

  2. 模板方法:AbstractApplicationContext.refresh()

  3. 观察者模式:ApplicationEvent事件机制

  4. 装饰器模式:BeanWrapper对Bean的包装

  5. 策略模式:InstantiationStrategy的不同实现


六、性能优化关键点
  1. BeanDefinition的缓存机制

  2. 类型转换的缓存(ResolvableType)

  3. 反射元数据的缓存(CachedIntrospectionResults)

  4. 合并BeanDefinition的优化(MergedBeanDefinition)


七、常见问题源码级解答

Q1:为什么构造器注入无法解决循环依赖?
源码证明:当检测到构造器循环依赖时,直接抛出BeanCurrentlyInCreationException

// DefaultSingletonBeanRegistry.beforeSingletonCreation()
protected void beforeSingletonCreation(String beanName) {
    if (!this.inCreationCheckExclusions.contains(beanName) 
        && !this.singletonsCurrentlyInCreation.add(beanName)) {
        throw new BeanCurrentlyInCreationException(beanName);
    }
}

Q2:@Autowired和@Resource的区别实现
源码差异:

  • AutowiredAnnotationBeanPostProcessor处理@Autowired

  • CommonAnnotationBeanPostProcessor处理@Resource


八、总结

通过对Spring IOC容器源码的逐层剖析,我们可以清晰看到:

  1. 容器初始化的12个标准步骤

  2. Bean生命周期的27个扩展点

  3. 循环依赖的三级缓存解决方案

  4. 注解驱动的实现原理

4.0.0 org.springframework spring-framework-bom 5.3.39 pom Spring Framework (Bill of Materials) Spring Framework (Bill of Materials) https://github.com/spring-projects/spring-framework Spring IO https://spring.io/projects/spring-framework Apache License, Version 2.0 https://www.apache.org/licenses/LICENSE-2.0 repo jhoeller Juergen Hoeller jhoeller@pivotal.io scm:git:git://github.com/spring-projects/spring-framework scm:git:git://github.com/spring-projects/spring-framework https://github.com/spring-projects/spring-framework GitHub https://github.com/spring-projects/spring-framework/issues org.springframework spring-aop 5.3.39 org.springframework spring-aspects 5.3.39 org.springframework spring-beans 5.3.39 org.springframework spring-context 5.3.39 org.springframework spring-context-indexer 5.3.39 org.springframework spring-context-support 5.3.39 org.springframework spring-core 5.3.39 org.springframework spring-expression 5.3.39 org.springframework spring-instrument 5.3.39 org.springframework spring-jcl 5.3.39 org.springframework spring-jdbc 5.3.39 org.springframework spring-jms 5.3.39 org.springframework spring-messaging 5.3.39 org.springframework spring-orm 5.3.39 org.springframework spring-oxm 5.3.39 org.springframework spring-r2dbc 5.3.39 org.springframework spring-test 5.3.39 org.springframework spring-tx 5.3.39 org.springframework spring-web 5.3.39 org.springframework spring-webflux 5.3.39 org.springframework spring-webmvc 5.3.39 org.springframework spring-websocket 5.3.39
最新发布
11-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值