https://zhuanlan.zhihu.com/p/83475033
一、前言
在介绍了 obtainFreshBeanFactory、invokeBeanFactoryPostProcessors、registerBeanPostProcessors 三个重要方法后,我们终于来到了最后一个重要方法:finishBeanFactoryInitialization。finishBeanFactoryInitialization 是这四个方法中最复杂也是最重要的,是整个 Spring IoC 核心中的核心。
二、概述
该方法会实例化所有剩余的非懒加载单例 bean。除了一些内部的 bean、实现了 BeanFactoryPostProcessor 接口的 bean、实现了 BeanPostProcessor 接口的 bean,其他的非懒加载单例 bean 都会在这个方法中被实例化,并且 BeanPostProcessor 的触发也是在这个方法中。
三、前置知识
不过在阅读源码之前,还是需要了解一些知识的。
- 什么是 FactoryBean ?
- FactoryBean 是如何使用的 ?
参考文章:14(1)-Spring源码refresh-BeanFactory和FactoryBean
四、正文
首先我们回到AbstractApplicationContext.refresh() 方法,找到代码:finishBeanFactoryInitialization(beanFactory),单击该行代码跳转到具体的实现。
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {// Initialize conversion service for this context.// 初始化类型转换器if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {beanFactory.setConversionService(beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));}// Register a default embedded value resolver if no bean post-processor// (such as a PropertyPlaceholderConfigurer bean) registered any before:// at this point, primarily for resolution in annotation attribute values.// 主要用于注释属性值的解析if (!beanFactory.hasEmbeddedValueResolver()) {beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));}// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.// 尽早初始化 LoadTimeWeaverAware Bean,以便尽早注册其转换器。String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);for (String weaverAwareName : weaverAwareNames) {getBean(weaverAwareName);}// Stop using the temporary ClassLoader for type matching.// 停止使用临时的ClassLoader进行类型匹配。beanFactory.setTempClassLoader(null);// Allow for caching all bean definition metadata, not expecting further changes.// 设置 beanDefinition 元数据 不可以再修改beanFactory.freezeConfiguration();// Instantiate all remaining (non-lazy-init) singletons.// 实例化单例 beanbeanFactory.preInstantiateSingletons();}
这里重点关注最后一行
beanFactory.preInstantiateSingletons();
4.1、preInstantiateSingletons
@Overridepublic void preInstantiateSingletons() throws BeansException {// 1.创建beanDefinitionNames的副本beanNames用于后续的遍历,// 以允许init等方法注册新的bean定义List<String> beanNames = new ArrayList<String>(this.beanDefinitionNames);// 2.遍历beanNames,触发所有非懒加载单例bean的初始化for (String beanName : beanNames) {// 3.获取beanName对应的MergedBeanDefinitionRootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);// 4.bd对应的Bean实例:不是抽象类 && 是单例 && 不是懒加载if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {// 5.判断beanName对应的bean是否为FactoryBeanif (isFactoryBean(beanName)) {// 5.1 通过beanName获取FactoryBean实例// 通过getBean(&beanName)拿到的是FactoryBean本身;通过getBean(beanName)拿到的是FactoryBean创建的Bean实例final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);// 5.2 判断这个FactoryBean是否希望急切的初始化boolean isEagerInit;if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {@Overridepublic Boolean run() {return ((SmartFactoryBean<?>) factory).isEagerInit();}}, getAccessControlContext());} else {isEagerInit = (factory instanceof SmartFactoryBean &&((SmartFactoryBean<?>) factory).isEagerInit());}if (isEagerInit) {// 5.3 如果希望急切的初始化,则通过beanName获取bean实例getBean(beanName);}} else {// 6.如果beanName对应的bean不是FactoryBean,只是普通Bean,通过beanName获取bean实例getBean(beanName);}}}// Trigger post-initialization callback for all applicable beans...// 7.遍历beanNames,触发所有SmartInitializingSingleton的后初始化回调for (String beanName : beanNames) {// 7.1 拿到beanName对应的bean实例Object singletonInstance = getSingleton(beanName);// 7.2 判断singletonInstance是否实现了SmartInitializingSingleton接口if (singletonInstance instanceof SmartInitializingSingleton) {final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;// 7.3 触发SmartInitializingSingleton实现类的afterSingletonsInstantiated方法if (System.getSecurityManager() != null) {AccessController.doPrivileged(new PrivilegedAction<Object>() {@Overridepublic Object run() {smartSingleton.afterSingletonsInstantiated();return null;}}, getAccessControlContext());} else {smartSingleton.afterSingletonsInstantiated();}}}}
MergedBeanDefinition可以参考
14(3)-Spring源码-MergeBeanDefinition源码分析
关于FactoryBean和BeanFactory的可以参考
14-Spring源码扩展-BeanFactory和FactoryBean
判断**beanName**对应的**bean**是**FactoryBean**的时候执行的逻辑:
