本篇文章,来介绍finishBeanFactoryInitialization(beanFactory);这个方法主要是完成bean的实例化,

invokeBeanFactoryPostProcessors(beanFactory);负责把所有的bean扫描到beanDefinitionMap中;

 

下面来说是如何初始化的

org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean

我们直接从这个方法开始说起,前面的调用链简单,就不说了

复制代码
 1 protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,  2             @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {  3  4     /** 5      * 通过name获取beanName,这里不使用name直接作为beanName有两个原因:  6      *  1.name可能是以&开头的,表明调用者想获取FactoryBean本身,而非FactoryBean;在beanFactory中factoryBean的存储也是map格式  7      *    <beanName,bean> 只是说,普通的beanName是没有&这个字符串的,所以,需要将name的首字母移除,这样才能从缓存中拿到factoryBean  8      *  2.还是别名的问题,需要转换  9      */10     final String beanName = transformedBeanName(name); 11     Object bean; 12 13     /**14      * 1.从单例池中获取当前bean 15      * 2.这里是循环依赖的重要方法之一 16      * 17      */18     // Eagerly check singleton cache for manually registered singletons.19     Object sharedInstance = getSingleton(beanName); 20     if (sharedInstance != null && args == null) { 21         if (logger.isDebugEnabled()) { 22             if (isSingletonCurrentlyInCreation(beanName)) { 23                 logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +24                         "' that is not fully initialized yet - a consequence of a circular reference"); 25             } 26             else { 27                 logger.debug("Returning cached instance of singleton bean '" + beanName + "'"); 28             } 29         } 30         bean = getObjectForBeanInstance(sharedInstance, name, beanName, null); 31     } 32 33     else { 34         // Fail if we're already creating this bean instance: 35         // We're assumably within a circular reference.36         /**37          * 这里判断bean是否在创建过程中,是第二次调用的时候 才会判断;如果是第一次执行到这里,set集合是空(这里判断的是原型bean) 38          */39         if (isPrototypeCurrentlyInCreation(beanName)) { 40             throw new BeanCurrentlyInCreationException(beanName); 41         } 42 43         //添加到alreadyCreated集合当中,表示当前bean已经创建过一次了44         if (!typeCheckOnly) { 45             markBeanAsCreated(beanName); 46         } 47 48         try { 49             final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName); 50             checkMergedBeanDefinition(mbd, beanName, args); 51 52             // Guarantee initialization of beans that the current bean depends on.53             String[] dependsOn = mbd.getDependsOn(); 54             if (dependsOn != null) { 55                 for (String dep : dependsOn) { 56                     if (isDependent(beanName, dep)) { 57                         throw new BeanCreationException(mbd.getResourceDescription(