Spring源碼窺探之:單實例Bean的建立過程

finishBeanFactoryInitialization(beanFactory);初始化剩下的全部的單實例(非懶加載)Bean(Instantiate all remaining (non-lazy-init) singletons.)緩存

1. beanFactory.preInstantiateSingletons();初始化剩下的全部的單實例(非懶加載)Beanapp

  1) 首先獲取全部BeanDefinition的名字List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);post

  2) 根據名字獲取Bean的定義信息RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);this

  3) 再依次判斷RootBeanDefinition不是抽象的,是單例的,不是懶加載的代理

    1> 判斷是否是工廠Bean,isFactoryBean(beanName),若是是的話,利用工廠來建立對象對象

    2> 若是不是,就用getBean(beanName);來建立對象.接口

      0. getBean(beanName)rem

      1. doGetBean(name, null, null, false);get

      2. 先從緩存中獲取單實例Bean,若是能獲取到說明這個Bean建立過(全部建立過的單實例Bean都會被緩存起來)it

      Object sharedInstance = getSingleton(beanName);

      /** Cache of singleton objects: bean name --> bean instance */

      private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

      3. 緩存中沒有的話,就來建立對象.

      4. 標記當前Bean已被建立

      5. 獲取Bean的定義信息

      6. 獲取當前Bean依賴的其它Bean(dependsOn),若是有按照getBean()把依賴的Bean先建立出來。

      7. 啓動單實例Bean的建立流程

        1)createBean(beanName,mbd,args)

        2)Object bean = resolveBeforeInstantiation(beanName, mbdToUse);讓BeanPostProcessor先攔截返回代理對象

          InstantiationAwareBeanPostProcessor提早執行:

          先觸發InstantiationAwareBeanPostProcessor接口中的postProcessBeforeInstantiation(beanClass, beanName);

          若是有返回值,那麼再觸發InstantiationAwareBeanPostProcessor中的postProcessAfterInitialization(result, beanName);

        3)若是InstantiationAwareBeanPostProcessor沒有返回代理對象

        4)Object beanInstance = doCreateBean(beanName, mbdToUse, args);建立Bean

          1. 【建立Bean的實例】instanceWrapper = createBeanInstance(beanName, mbd, args);建立Bean

            利用工廠方法或者構造器來建立Bean的實例

          2. applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);

            調用MergedBeanDefinitionPostProcessor的bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);

相關文章
相關標籤/搜索