Spring IOC源码解读

目录

代码示例:

1. 启动类

2. xml文件

继承关系图

创建 Bean 容器,加载并注册 Bean

1. AbstractApplicationContext.obtainFreshBeanFactory() 

2. refreshBeanFactory()

加载bean

准备 Bean 容器

3 AbstractApplicationContext.prepareBeanFactory 

4 AbstractApplicationContext.invokeBeanFactoryPostProcessors

初始化所有的singleton bean

DefaultListableBeanFactory.preInstantiateSingletons();

getBean(beanName);

createBean方法

创建 Bean

重点一、createBeanInstance 创建bean实例

重点二、属性注入 populateBean

重点三、initializeBean


官网:spring官网地址

看源码的一点忠告:看源码,并不是第一次debug的时候就一个一个方法都跟进去看,这样容易看懵,第一遍先看大概的框架,等熟悉了之后,想要去看细节的时候,再一点一点深入。

比如IOC,我们就先重点关注refresh()方法,根据方法名和下面的注释其实可以清楚大概都做了什么,对这块有初步的了解。第二遍debug就可以看下面标注的需要重点关注的方法,当然可能要debug好多遍,然后再去看spring留给我们的扩展点。

在看的过程中,带着问题,为什么这么做?如果让我来实现,我该怎么做?

好了,接下来,开始我们的IOC源码之旅!

代码示例:

1. 启动类

public class IocApplication {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("annotationBean.xml");
    }
}

2. xml文件

annotationBean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="catCat" class="com.spring.anntatio.CatCat"/>

</beans>

继承关系图

AbstractApplicationContext.refresh()方法:【在这个方法上打断点】

先大概看下refresh()都做了什么,下面会对重要方法进行详细说明

	@Override
	public void refresh() throws BeansException, IllegalStateException {
        // 加锁,防止 refresh() 还没结束,又执行启动或销毁容器的操作
		synchronized (this.startupShutdownMonitor) {
			// Prepare this context for refreshing.
            // 准备工作,不用过多关注
			prepareRefresh();

			// Tell the subclass to refresh the internal bean factory.
            // 创建容器对象,:DefaultListableBeanFactory
            // 加载xml配置文件的属性值到当前工厂中,最重要的就是BeanDefinition
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// Prepare the bean factory for use in this context.
            // 设置 BeanFactory 的类加载器,添加几个 BeanPostProcessor,手动注册几个特殊的 bean
			prepareBeanFactory(beanFactory);

			try {
				// Allows post-processing of the bean factory in context subclasses.
                // *** 扩展点,到这里的时候,所有的 Bean 都加载、注册完成了,但是都还没有初始化
                // 子类覆盖方法做额外的处理,此处我们自己一般不做任何扩展工作,但是可以查看web中的代码,是有具体实现的
				postProcessBeanFactory(beanFactory);

				// Invoke factory processors registered as beans in the context.
                // *** 重要扩展点  调用 BeanFactoryPostProcessor 各个实现类的 postProcessBeanFactory(factory) 方法
				invokeBeanFactoryPostProcessors(beanFactory);

				// Register bean processors that intercept bean creation.
                // 注册 BeanPostProcessor 的实现类,注意看和 BeanFactoryPostProcessor 的区别
                // 两个方法分别在 Bean 初始化之前和初始化之后得到执行。注意,到这里 Bean 还没初始化
                // 这里只是注册功能,真正调用的是getBean方法
				registerBeanPostProcessors(beanFactory);

				// Initialize message source for this context.
                // 初始化当前ApplicationContext 的 MessageSource
                // 为上下文初始化message源,即不同语言的消息体,国际化处理
				initMessageSource();

				// Initialize event multicaster for this context.
                // 初始化当前 ApplicationContext 的事件广播器
				initApplicationEventMulticaster();

				// Initialize other special beans in specific context subclasses.
                // 模板方法 提供给子类实现
				onRefresh();

				// Check for listener beans and register them.
                // 注册事件监听器:在所有注册的bean中查找Listener bean,注册到消息广播器中
				registerListeners();

				// Instantiate all remaining (non-lazy-init) singletons.
                // 这里是重点!!!!
                // 初始化所有的 singleton beans【非懒加载bean】
				finishBeanFactoryInitialization(beanFactory);

				// Last step: publish corresponding event.
                // 广播事件,ApplicationContext 初始化完成
				finishRefresh();
			}

			catch (BeansException ex) {
				if (logger.isWarnEnabled()) {
					logger.warn("Exception encountered during context initialization - " +
							"cancelling refresh attempt: " + ex);
				}

				// Destroy already created singletons to avoid dangling resources.
                // 销毁已经初始化的 singleton 的 Beans,减少占用资源
				destroyBeans();

				// Reset 'active' flag.
				cancelRefresh(ex);

				// Propagate exception to caller.
                // 异常抛出
				throw ex;
			}

			finally {
				// Reset common introspection caches in Spring's core, since we
				// might not ever need metadata for singleton beans anymore...
				resetCommonCaches();
			}
		}
	}

创建 Bean 容器,加载并注册 Bean

1. AbstractApplicationContext.obtainFreshBeanFactory() 

初始化 BeanFactory、加载 Bean、注册 Bean 等

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
        this.refreshBeanFactory();
        return this.getBeanFactory();
}

1.1 AbstractRefreshableApplicationContext.refreshBeanFactory()

	@Override
	protected final void refreshBeanFactory() throws BeansException {
        // 如果 ApplicationContext 中已经加载过 BeanFactory 了,销毁所有 Bean,关闭 BeanFactory
        // 注意:判断的是当前ApplicationContext,不是全局,因为BeanFactory本来就是可以有多个的
		if (hasBeanFactory()) {
			destroyBeans();
			closeBeanFactory();
		}
		try {
            // 创建bean工厂
			DefaultListableBeanFactory beanFactory = createBeanFactory();
			beanFactory.setSerializationId(getId());

            // 重要!!置 BeanFactory 的两个配置属性:1. 是否允许覆盖 2. 是否允许循环引用
			customizeBeanFactory(beanFactory);
            // 重要!!加载BeanFactory
            // 初始化documentReader,并进行XML文件读取及解析,默认命名空间的解析,自定义标签的解析
			loadBeanDefinitions(beanFactory);

			synchronized (this.beanFactoryMonitor) {
				this.beanFactory = beanFactory;
			}
		}
		catch (IOException ex) {
			throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
		}
	}

2. refreshBeanFactory()

2.1 AbstractRefreshableApplicationContext.customizeBeanFactory

    protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
        // 是否允许 Bean 覆盖
        if (this.allowBeanDefinitionOverriding != null) {
            beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
        }

        // 是否允许 Bean 间的循环依赖
        if (this.allowCircularReferences != null) {
            beanFactory.setAllowCircularReferences(this.allowCircularReferences);
        }

    }

定义解释:

BeanDefinition覆盖:就是在配置文件中定义 bean 时使用了相同的 id 或 name,默认情况下,在同一配置文件不可以;若在不同配置文件会发生覆盖。

循环依赖:A 依赖 B,而 B 依赖 A。或 A 依赖 B,B 依赖 C,而 C 依赖 A。默认情况下,Spring 允许循环依赖。

加载bean

2.2 AbstractXmlApplicationContext.loadBeanDefinitions

这个方法将根据配置,加载各个 Bean,然后放到 BeanFactory 中

    protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
        // 实例化一个XmlBeanDefinitionReader
        XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);

        // 略
        beanDefinitionReader.setEnvironment(this.getEnvironment());
        beanDefinitionReader.setResourceLoader(this);
        beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
        this.initBeanDefinitionReader(beanDefinitionReader);

        // 这是重点!!!
        this.loadBeanDefinitions(beanDefinitionReader);
    }
    protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
        // 获取配置文件
        Resource[] configResources = this.getConfigResources();
        if (configResources != null) {
            reader.loadBeanDefinitions(configResources);
        }

        // 获取配置文件路径
        String[] configLocations = this.getConfigLocations();
        if (configLocations != null) {
            reader.loadBeanDefinitions(configLocations);
        }

    }

2.3 AbstractBeanDefinitionReader.loadBeanDefinitions

    public int loadBeanDefinitions(String... locations) throws BeanDefinitionStoreException {
        Assert.notNull(locations, "Location array must not be null");
        int count = 0;
        String[] var3 = locations;
        int var4 = locations.length;

        for(int var5 = 0; var5 < var4; ++var5) {
            String location = var3[var5];
            count += this.loadBeanDefinitions(location);
        }

        return count;
    }

2.4 接下来流程很长,主要是做xml解析,创建BeanDefinition等,这里暂时不做展开,后续可能补充。

2.5 DefaultListableBeanFactory.registerBeanDefinition

主要是把BeanDefinition放入到beanDefinitionMap。把BeanName放入到beanDefinitionNames,按照Bean的配置的顺序注册Bean。

private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap(256);

private volatile List<String> beanDefinitionNames = new ArrayList(256);

准备 Bean 容器

3 AbstractApplicationContext.prepareBeanFactory 

准备BeanFactory


    protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        // 设置 BeanFactory 的类加载器
        beanFactory.setBeanClassLoader(this.getClassLoader());
        beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
        beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, this.getEnvironment()));

        // 实现了Aware接口的几个特殊的beans,初始化时,进行回调
        beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));


        beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
        beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
        beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
        beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
        beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
        beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);


        // 为特殊的几个 bean 赋值
        // ApplicationContext继承了ResourceLoader、ApplicationEventPublisher、MessageSource
        // 但是这里没有给MessageSource赋值,是因为MessageSource被注册成了一个普通的bean
        beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
        beanFactory.registerResolvableDependency(ResourceLoader.class, this);
        beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
        beanFactory.registerResolvableDependency(ApplicationContext.class, this);

        // 在 bean 实例化后,如果是 ApplicationListener 的子类,那么将其添加到 listener 列表中,可以理解成:注册事件监听器
        beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

        // 这里不是重点,先忽略
        if (beanFactory.containsBean("loadTimeWeaver")) {
            beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
            beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
        }

        // Spring 往往很 "智能" 就是因为它会帮我们默认注册一些有用的 bean,我们可以覆盖掉

        if (!beanFactory.containsLocalBean("environment")) {
            beanFactory.registerSingleton("environment", this.getEnvironment());
        }

        if (!beanFactory.containsLocalBean("systemProperties")) {
            beanFactory.registerSingleton("systemProperties", this.getEnvironment().getSystemProperties());
        }

        if (!beanFactory.containsLocalBean("systemEnvironment")) {
            beanFactory.registerSingleton("systemEnvironment", this.getEnvironment().getSystemEnvironment());
        }

    }

4 AbstractApplicationContext.invokeBeanFactoryPostProcessors

这是一个重要的扩展点

    protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
        PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, this.getBeanFactoryPostProcessors());
        // 省略。。。

    }

将执行BeanFactory后置处理器方法的工作委派给了PostProcessorRegistrationDelegate

public static void invokeBeanFactoryPostProcessors(
			ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
		// 根据:BeanFactoryPostProcessor类型,从所有bean定义中获取类名,因为bean定义已经扫描过了,所以这里能够拿到
		String[] postProcessorNames =
				beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class,
						true, false);
		for (String ppName : postProcessorNames) {
			// 如果已经存在了,那么这里没有做任何事情,就不添加进去额
			if (processedBeans.contains(ppName)) {
				// 跳过——已经在上面的第一阶段处理
			}
			else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				// 如果存在PriorityOrdered,它的优先级是最高的
				priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
			}
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
				// 如果指定了顺序的
				orderedPostProcessorNames.add(ppName);
			}
			else {
				// 如果没有指定顺序的
				nonOrderedPostProcessorNames.add(ppName);
			}
		}
	}
	// 一波排序之后... 
	invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
}

从这里就可以看到,我们只要实现了BeanFactoryPostProcessor接口,并且将其实现类加入到spring容器当中,他就会在这个位置来解析我们自定义的BeanFactory,并且下面会执行方法。

循环调用其方法:

    private static void invokeBeanFactoryPostProcessors(Collection<? extends BeanFactoryPostProcessor> postProcessors, ConfigurableListableBeanFactory beanFactory) {
        Iterator var2 = postProcessors.iterator();

        // 实际调用在这里
        while(var2.hasNext()) {
            BeanFactoryPostProcessor postProcessor = (BeanFactoryPostProcessor)var2.next();
            postProcessor.postProcessBeanFactory(beanFactory);
        }

    }

那我们就应该提出疑问,spring提供给我们这个扩展点,是想做什么呢?

@FunctionalInterface
public interface BeanFactoryPostProcessor {
    void postProcessBeanFactory(ConfigurableListableBeanFactory var1) throws BeansException;
}

这些后置处理器,他会在所有bean实例化之前进行应用,主要是提供给开发者去修改bean定义,以达到bean实例的生成按照自己的方式来生成。这里不建议调用getBean方法,使其bean过早的实例化,这可能会破坏容器并导致意外的副作用。它的执行顺序可以按照Order来指定:order数字越大,优先级越低。
比如:

@Component
@Order(1)
public class BeanFactoryPostProcessorExtension implements BeanFactoryPostProcessor {

	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
		// ...
	}
}

初始化所有的singleton bean

 finishBeanFactoryInitialization(beanFactory); 这里会负责初始化所有的 singleton beans。

初始化剩余的 singleton beans


    protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
        // 首先,初始化名字为 conversionService 的 Bean
        if (beanFactory.containsBean("conversionService") && beanFactory.isTypeMatch("conversionService", ConversionService.class)) {
            beanFactory.setConversionService((ConversionService)beanFactory.getBean("conversionService", ConversionService.class));
        }

        if (!beanFactory.hasEmbeddedValueResolver()) {
            beanFactory.addEmbeddedValueResolver((strVal) -> {
                return this.getEnvironment().resolvePlaceholders(strVal);
            });
        }

        // 省略。。

        // 到这一步的时候,Spring 已经开始预初始化 singleton beans 了
        // 冻结所有bean定义,这个时候不会再出现 bean 定义解析、加载、注册
        beanFactory.freezeConfiguration();
        // 实例化剩余的非懒加载单例bean
        beanFactory.preInstantiateSingletons();
    }

又回到了DefaultListableBeanFactory类

DefaultListableBeanFactory.preInstantiateSingletons();

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

		// Iterate over a copy to allow for init methods which in turn register new bean definitions.
		// While this may not be part of the regular factory bootstrap, it does otherwise work fine.
        // 这就是之前加载到BeanFactory中的Bean名称
		List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

		// Trigger initialization of all non-lazy singleton beans...
        // 触发所有非延迟加载单例bean的初始化,遍历集合的对象
		for (String beanName : beanNames) {
            // 合并父类BeanDefinition
			RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
            // 条件判断。抽象。 单例。 非懒加载
			if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
                // 判断是否实现了FactoryBean接口
				if (isFactoryBean(beanName)) {

                    // 根据& + beanName来获取具体的对象
					Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);


                    // 进行类型转换
					if (bean instanceof FactoryBean) {
						final FactoryBean<?> factory = (FactoryBean<?>) bean;
                        // 判断这个FactoryBean是否希望急切的初始化
						boolean isEagerInit;
						if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
							isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)
											((SmartFactoryBean<?>) factory)::isEagerInit,
									getAccessControlContext());
						}
						else {
							isEagerInit = (factory instanceof SmartFactoryBean &&
									((SmartFactoryBean<?>) factory).isEagerInit());
						}
						if (isEagerInit) {
							getBean(beanName);
						}
					}
				}
				else {
					getBean(beanName);
				}
			}
		}

		// Trigger post-initialization callback for all applicable beans...
		for (String beanName : beanNames) {
			Object singletonInstance = getSingleton(beanName);
			if (singletonInstance instanceof SmartInitializingSingleton) {
                // 如果我们定义的 bean 是实现了 SmartInitializingSingleton 接口的,那么在这里得到回调
				final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
				if (System.getSecurityManager() != null) {
					AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
						smartSingleton.afterSingletonsInstantiated();
						return null;
					}, getAccessControlContext());
				}
				else {
					smartSingleton.afterSingletonsInstantiated();
				}
			}
		}
	}

getBean(beanName);

AbstractBeanFactory.getBean(beanName)

    public Object getBean(String name) throws BeansException {
        // 此方法是实际获取bean的方法,也是触发依赖注入的方法
        return this.doGetBean(name, (Class)null, (Object[])null, false);
    }



    protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly) throws BeansException {
        // 获取真正的bean名字,处理别名
        String beanName = this.transformedBeanName(name);
        
        // 检查下是否已经创建了bean
        Object sharedInstance = this.getSingleton(beanName);
        Object bean;
        
            // 省略。。

            bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, (RootBeanDefinition)null);
        } else {
            // 省略。。

            try {
                
                // 省略。。

                // 先初始化依赖的所有 Bean【depends-on 中定义的依赖】
                String[] dependsOn = mbd.getDependsOn();
                String[] var11;
                if (dependsOn != null) {
                    var11 = dependsOn;
                    int var12 = dependsOn.length;

                    for(int var13 = 0; var13 < var12; ++var13) {
                        String dep = var11[var13];
                        if (this.isDependent(beanName, dep)) {
                            throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
                        }

                        // 注册依赖关系
                        this.registerDependentBean(dep, beanName);

                        try {
                            // 初始化
                            this.getBean(dep);
                        } catch (NoSuchBeanDefinitionException var24) {
                            throw new BeanCreationException(mbd.getResourceDescription(), beanName, "'" + beanName + "' depends on missing bean '" + dep + "'", var24);
                        }
                    }
                }

                // 单例的
                if (mbd.isSingleton()) {
                    sharedInstance = this.getSingleton(beanName, () -> {
                        try {
                            // 创建bean实例
                            return this.createBean(beanName, mbd, args);
                        } catch (BeansException var5) {
                            this.destroySingleton(beanName);
                            throw var5;
                        }
                    });
                    bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
                } //Prototype类型的
            else if (mbd.isPrototype()) {
                // It's a prototype -> create a new instance.
                Object prototypeInstance = null;
                try {
                    beforePrototypeCreation(beanName);
                    prototypeInstance = createBean(beanName, mbd, args);
                }
                finally {
                    afterPrototypeCreation(beanName);
                }
                bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
            }

            else {
                //其他Scope类型,委托给相应的实现类来处理
                String scopeName = mbd.getScope();
                final Scope scope = this.scopes.get(scopeName);
              
                try {
                    Object scopedInstance = scope.get(beanName, () -> {
                        beforePrototypeCreation(beanName);
                        try {
                            return createBean(beanName, mbd, args);
                        }
                        finally {
                            afterPrototypeCreation(beanName);
                        }
                    });
                    bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
                }

                    
                // 省略代码。。

            } catch (BeansException var26) {
                this.cleanupAfterBeanCreationFailure(beanName);
                throw var26;
            }
        }

            // 省略代码  。。      

            return bean;
        }
    }

createBean方法

protected abstract Object createBean(String var1, RootBeanDefinition var2, @Nullable Object[] var3) throws BeanCreationException;

AbstractAutowireCapableBeanFactory.createBean()

protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
    throws BeanCreationException {
    //省略代码...
    //解析Bean类型
    Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
    if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
        mbdToUse = new RootBeanDefinition(mbd);
        mbdToUse.setBeanClass(resolvedClass);
    }

    //省略代码...
    
    try {
        //创建Bean
        Object beanInstance = doCreateBean(beanName, mbdToUse, args);
        if (logger.isTraceEnabled()) {
            logger.trace("Finished creating instance of bean '" + beanName + "'");
        }
        return beanInstance;
    }
}

创建 Bean

AbstractAutowireCapableBeanFactory.doCreateBean

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
    throws BeanCreationException {

    BeanWrapper instanceWrapper = null;
    if (mbd.isSingleton()) {
        instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
    }
    if (instanceWrapper == null) {
        //创建Bean的实例(重点关注)
        // 根据执行bean使用对应的策略创建新的示例,如:工厂方法、构造函数主动注入、简单初始化
        instanceWrapper = createBeanInstance(beanName, mbd, args);
    }
    final Object bean = instanceWrapper.getWrappedInstance();
    Class<?> beanType = instanceWrapper.getWrappedClass();
    if (beanType != NullBean.class) {
        mbd.resolvedTargetType = beanType;
    }

    // 先忽略
    synchronized (mbd.postProcessingLock) {
        if (!mbd.postProcessed) {
            try {
                applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
            }
            mbd.postProcessed = true;
        }
    }

    // 解决循环依赖的问题,未展开讲
    boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
                                      isSingletonCurrentlyInCreation(beanName));
    if (earlySingletonExposure) {
        addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
    }

    Object exposedObject = bean;
    try {
        // 也是重点!! 前面的实例只是实例化了,这里进行属性赋值
        // 其中,可能存在依赖于其他bean的属性,则会递归初始化依赖的bean
        populateBean(beanName, mbd, instanceWrapper);

        // 很重要!!处理初始化后的bean的各种回调。很多扩展点在这里展开;InitializingBean、BeanPostProcessor
        exposedObject = initializeBean(beanName, exposedObject, mbd);
    }

	//省略代码...

    // Register bean as disposable.
    try {

        registerDisposableBeanIfNecessary(beanName, bean, mbd);
    }

    return exposedObject;
}

到这里,整个初始化流程就结束了。

上面doCreateBean()方法中有三个方法需要分析下:

1. instanceWrapper = this.createBeanInstance(beanName, mbd, args);  创建实例

2. this.populateBean(beanName, mbd, instanceWrapper);

3. exposedObject = this.initializeBean(beanName, exposedObject, mbd);

重点一、createBeanInstance 创建bean实例


    protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
        Class<?> beanClass = this.resolveBeanClass(mbd, beanName, new Class[0]);
        if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
            throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
        } else {
            Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
            if (instanceSupplier != null) {
                return this.obtainFromSupplier(instanceSupplier, beanName);
            } else if (mbd.getFactoryMethodName() != null) {
                return this.instantiateUsingFactoryMethod(beanName, mbd, args);
            } else {
                boolean resolved = false;
                boolean autowireNecessary = false;
                if (args == null) {
                    synchronized(mbd.constructorArgumentLock) {
                        if (mbd.resolvedConstructorOrFactoryMethod != null) {
                            resolved = true;
                            autowireNecessary = mbd.constructorArgumentsResolved;
                        }
                    }
                }

                // 主要看下instantiateBean()方法

                if (resolved) {
                    return autowireNecessary ? this.autowireConstructor(beanName, mbd, (Constructor[])null, (Object[])null) : this.instantiateBean(beanName, mbd);
                } else {
                    Constructor<?>[] ctors = this.determineConstructorsFromBeanPostProcessors(beanClass, beanName);
                    if (ctors == null && mbd.getResolvedAutowireMode() != 3 && !mbd.hasConstructorArgumentValues() && ObjectUtils.isEmpty(args)) {
                        ctors = mbd.getPreferredConstructors();
                        return ctors != null ? this.autowireConstructor(beanName, mbd, ctors, (Object[])null) : this.instantiateBean(beanName, mbd);
                    } else {
                        return this.autowireConstructor(beanName, mbd, ctors, args);
                    }
                }
            }
        }
    }
    protected BeanWrapper instantiateBean(String beanName, RootBeanDefinition mbd) {
        try {
            Object beanInstance;
            if (System.getSecurityManager() != null) {
                beanInstance = AccessController.doPrivileged(() -> {
                    return thisx.getInstantiationStrategy().instantiate(mbd, beanName, this);
                }, this.getAccessControlContext());
            } else {
                // 实例化
                beanInstance = this.getInstantiationStrategy().instantiate(mbd, beanName, this);
            }

            // 包装后,返回
            BeanWrapper bw = new BeanWrapperImpl(beanInstance);
            this.initBeanWrapper(bw);
            return bw;
        } catch (Throwable var6) {
            throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Instantiation of bean failed", var6);
        }
    }
instantiate

    public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) {
        if (!bd.hasMethodOverrides()) {
            
            // 省略部分代码

            // 利用构造方法进行实例化【反射】
            return BeanUtils.instantiateClass(constructorToUse, new Object[0]);
        } else {
            // 利用CGlib实例化
            return this.instantiateWithMethodInjection(bd, beanName, owner);
        }
    }

重点二、属性注入 populateBean


    protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
        if (bw == null) {
            if (mbd.hasPropertyValues()) {
                throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
            }
        } else {
            if (!mbd.isSynthetic() && this.hasInstantiationAwareBeanPostProcessors()) {
                Iterator var4 = this.getBeanPostProcessors().iterator();

                while(var4.hasNext()) {
                    BeanPostProcessor bp = (BeanPostProcessor)var4.next();
                    if (bp instanceof InstantiationAwareBeanPostProcessor) {
                        InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor)bp;
                        if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                            return;
                        }
                    }
                }
            }

            PropertyValues pvs = mbd.hasPropertyValues() ? mbd.getPropertyValues() : null;
            int resolvedAutowireMode = mbd.getResolvedAutowireMode();
            if (resolvedAutowireMode == 1 || resolvedAutowireMode == 2) {
                MutablePropertyValues newPvs = new MutablePropertyValues((PropertyValues)pvs);

                // 通过名字找属性
                if (resolvedAutowireMode == 1) {
                    this.autowireByName(beanName, mbd, bw, newPvs);
                }

                // 通过类型找属性
                if (resolvedAutowireMode == 2) {
                    this.autowireByType(beanName, mbd, bw, newPvs);
                }

                pvs = newPvs;
            }

            boolean hasInstAwareBpps = this.hasInstantiationAwareBeanPostProcessors();
            boolean needsDepCheck = mbd.getDependencyCheck() != 0;
            PropertyDescriptor[] filteredPds = null;
            if (hasInstAwareBpps) {
                if (pvs == null) {
                    pvs = mbd.getPropertyValues();
                }

                Iterator var9 = this.getBeanPostProcessors().iterator();

                while(var9.hasNext()) {
                    BeanPostProcessor bp = (BeanPostProcessor)var9.next();
                    if (bp instanceof InstantiationAwareBeanPostProcessor) {
                        InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor)bp;
                        PropertyValues pvsToUse = ibp.postProcessProperties((PropertyValues)pvs, bw.getWrappedInstance(), beanName);
                        if (pvsToUse == null) {
                            if (filteredPds == null) {
                                filteredPds = this.filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
                            }

                            pvsToUse = ibp.postProcessPropertyValues((PropertyValues)pvs, filteredPds, bw.getWrappedInstance(), beanName);
                            if (pvsToUse == null) {
                                return;
                            }
                        }

                        pvs = pvsToUse;
                    }
                }
            }

            if (needsDepCheck) {
                if (filteredPds == null) {
                    filteredPds = this.filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
                }

                this.checkDependencies(beanName, mbd, filteredPds, (PropertyValues)pvs);
            }

            if (pvs != null) {
                // 设置属性值
                this.applyPropertyValues(beanName, mbd, bw, (PropertyValues)pvs);
            }

        }
    }

重点三、initializeBean

【自定义的扩展点基本都在这】

    protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
        if (System.getSecurityManager() != null) {
            AccessController.doPrivileged(() -> {
                this.invokeAwareMethods(beanName, bean);
                return null;
            }, this.getAccessControlContext());
        } else {
            // 
            this.invokeAwareMethods(beanName, bean);
        }

        Object wrappedBean = bean;
        if (mbd == null || !mbd.isSynthetic()) {

            // BeanPostProcessor 的 postProcessBeforeInitialization 回调【扩展点】
            wrappedBean = this.applyBeanPostProcessorsBeforeInitialization(bean, beanName);
        }

        try {

            // 1. 执行InitializingBean.afterPropertiesSet(拓展点)
            // 2. 执行Bean自定义的init-method方法(拓展点)
            this.invokeInitMethods(beanName, wrappedBean, mbd);
        } catch (Throwable var6) {
            throw new BeanCreationException(mbd != null ? mbd.getResourceDescription() : null, beanName, "Invocation of init method failed", var6);
        }

        if (mbd == null || !mbd.isSynthetic()) {
            wrappedBean = this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
        }

        return wrappedBean;
    }

 下面有一些扩展点还没整理出来,后续有时间会进行完善。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值