Spring 源码详解Bean创建 (二)

接上篇Spring 源码详解IOC (一)最后一步(实例化剩下单例Bean)

image.png

在介绍接下来的流程之前先明确Bean定义信息和Bean实例化后的存储位置以及Bean创建的基本流程
image.png

image.png

举个注入的例子,CusBean的实例化需要注入CusDepBean的实例
image.png

image.png

AbstractApplicationContext.finishBeanFactoryInitialization()

DefaultListableBeanFactory.preInstantiateSingletons()

@Override
public void preInstantiateSingletons() throws BeansException {
    if (logger.isTraceEnabled()) {
        logger.trace("Pre-instantiating singletons in " + this);
    }

    // 获取已经注册的BeanDefinition
    List beanNames = new ArrayList<>(this.beanDefinitionNames);

    // 所有非懒加载的单例Bean初始化
    for (String beanName : beanNames) {
        //合并BeanDenifition
        RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
        //该BeanDefinition对应的对象既不是抽象类并且不是懒加载并且是单例
        if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
            if (isFactoryBean(beanName)) {
                Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
                if (bean instanceof FactoryBean) {
                    FactoryBean factory = (FactoryBean) bean;
                    boolean isEagerInit;
                    if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
                        isEagerInit = AccessController.doPrivileged(
                                (PrivilegedAction) ((SmartFactoryBean) factory)::isEagerInit,
                                getAccessControlContext());
                    }
                    else {
                        isEagerInit = (factory instanceof SmartFactoryBean &&
                                ((SmartFactoryBean) factory).isEagerInit());
                    }
                    if (isEagerInit) {
                        getBean(beanName);
                    }
                }
            }
            else {
                //开始实例化调用AbstractBeanFactory.getBean->AbstractBeanFactory.doGetBean
                getBean(beanName);
            }
        }
    }
}
image.png
image.png

image.png

以下为Bean定义信息的合并以及待处理注入缓存的创建

image.png

image.png

image.png

Bean定义信息的合并以及待处理注入缓存的创建完成以后继续执行属性的填充和对象的初始化,先分析对象属性的填充


image.png

image.png

image.png

image.png

image.png

结束

你可能感兴趣的:(Spring 源码详解Bean创建 (二))