Spring源碼系列:依賴注入(四)-總結

在上面三篇文章中對依賴注入作了一個大體的梳理;裏面都是大量代碼的分析,本文在此基礎上進行一個總結概括。post

依賴注入調用過程

如前幾篇文章所述,依賴注入是由getBean來觸發的;而後涉及到bean實例的建立、依賴關係的創建、屬性注入等子過程。3d

  • getBean 方法觸發依賴注入
  • doGetBean 從容器中查找Bean(BeanFactory鏈,當前容器->雙親容器-雙親容器...)

固然,在獲取到某個Bean的時候也會經過遞歸的方式來依賴注入依賴的beancode

  • createBeanInstance 生成了Bean所包含的Java對象,Spring中用SimpleInstantiationStrategy類來生成Bean對象的實例,實例化Java對象的方法有兩種(CGlib是默認方式):cdn

    • 經過BeanUtils,它使用了JVM的反射功能來生成Java對象實例
    • 用CGLIB來生成,CGLIB是一種經常使用的字節碼生成器的類庫
  • populateBean 設置Bean對象的依賴關係對象

  • resolveValueIfNecessary 注入類型的處理;解析不一樣類型的屬性blog

  • setPropertyValues 屬性注入遞歸

關於lazy-init

Ioc容器的初始化過程當中,主要的工做就是對BeanDefinition的定位、載入、解析和註冊;可是就像以前說過的,此時依賴注入尚未發生。在Spring源碼系列:依賴注入(一)getBean文中提到,依賴注入發生在應用第一次向容器獲取Bean的時候;也就是上面說到的經過getBean來觸發。get

固然,依賴注入也能夠在容器初始化的過程當中就完成。這個就是lazy-init屬性的存在乎義了。就是說咱們能夠經過設置Bean的lazy-init屬性來控制預實例化的過程。源碼

預實例化:在初始化容器時完成Bean的依賴注入it

這種作法的好處在於提升了咱們第一次獲取Bean的的效率,可是它也下降了容器初始化的速度。(這個其實很好理解的,由於第一次獲取Bean的時候,依賴注入已經完成了,直接拿過來用就行)

關於lazy-init屬性的處理也是在wac.refresh這個方法中完成的,具體是在finishBeanFactoryInitialization方法中。若是繼續追溯的話,最終是交給DefaultListableBeanFactory容器中的preInstantiateSingletons方法中完成。

lazy-init這種實例化方式就是經過將依賴注入委託給容器來處理,而不是在用戶第一貫容器申請的Bean的時候完成依賴注入,不一樣的階段,也有不一樣的優劣。

相關文章
相關標籤/搜索