Spring IOC 學習(三)IOC容器的依賴注入

前面兩 個小結中學習了spring 中的 bean 解析,裝載過程。spring

先回顧一下吧!簡單能夠將這個過程分爲四個步驟分別是框架

1,資源定位(spring 能夠有多種建立bean的資源 xml,properties...) Resource 及其實如今spring框架中就擔任定位資源文件的重要功能。學習

2,建立承載bean的容器 BeanFactory 就是完成這項功能的頂級接口。默認實現DefaultListableBeanFactoryprototype

3,bean 的解析根據不一樣的資源文件解析獲得bean對象的描述信息 BeanDefinition 對象。該過程是由BeanDefaintionRender接口和其集團實現來完成的。居於xml的XmlBeanDefaintionRender...xml

4,將解析的 bean 註冊到IOC 容器中去,BeanDefaintionRegister接口中聲明的loadBeanDefinitions(Resource);對象

就是要完成該功能。默認容器DefaultListableBeanFactory中已經實現。blog

回顧spring bean解析,裝載過程以後接下來就是spring bean之間的依賴關係注入了.遞歸

 解析,裝載只是完成了bean的數據映射關係,只是將bean的基本信息映射爲beanDefinition對象,能夠看做是資源文件的解析過程。接口

   spring 中bean是什麼時候創建依賴關係的呢? 該過程是在於第一次獲取bean的時候觸發的(若是沒有顯示的聲明 lazy-init)你也能夠在加載bena 的時候就創建依賴關係可是這樣的就會大大延長加載bean的時間。資源

 也就是BeanFactory接口中的getBean(....);方法觸發依賴關係的注入,該方法有多個重載形式但最後都會調用doGetBean(...);方法 該方法在AbstracBeanFactory中實現:

 該方法主要完成如下幾件事情:

 1,根據名稱查找容器中的BeanDefinition對象

   2,獲取當前 BeanDefinition 對象獲取該bean依賴的其餘bena對象。遞歸調用 getBean 方法 。

   3,而後根據獲得的BeanDefinition信息創建bean對象,這個對象創建好後依賴關係也就注入完畢了。(創建對象的時候singleton和prototype有所不一樣)

  singleton 建立完後放入map中 在 DefaultSingletonBeanRegistry類中實現。

  /** Cache of singleton objects: bean name --> bean instance */
  private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>();

   4 檢查bean 的類型 返回bean對象。

 

 singletone , prototype 兩種bean 的建立過程源碼再也不貼出,該方法中詳細列出能夠參看細節實現.

該方法還有一個值得注意的地方就是 在該方法中會調用 createBean(beanName, mbd, args); 該方法這是建立伊朗關係的具體代碼實現方法。

該方法的實現是在 AbstractAutowireCapableBeanFactory 中實現

該方法檢查bean 的狀態,真正完成依賴關係注入的方法是doCrateBean方法 

實例化不bean的實現createBeannInatance 

...未完....

相關文章
相關標籤/搜索