分析spring源碼第七篇:bean的生命週期

bean的生命週期

一. 其實在查看源碼BeanFactory時,就會發現源碼就介紹了bean的生命週期,原文以下:

二. bean的實例化過程以下圖:

 

bean的生命週期流程圖以下圖:spring

三. Bean實例生命週期的執行過程以下:

  • Spring對bean進行實例化,默認bean是單例;post

  • Spring對bean進行依賴注入;spa

  • 若是bean實現了BeanNameAware接口,spring將bean的id傳給setBeanName()方法;.net

  • 若是bean實現了BeanFactoryAware接口,spring將調用setBeanFactory方法,將BeanFactory實例傳進來;prototype

  • 若是bean實現了ApplicationContextAware接口,它的setApplicationContext()方法將被調用,將應用上下文的引用傳入到bean中;xml

  • 若是bean實現了BeanPostProcessor接口,它的postProcessBeforeInitialization方法將被調用;對象

  • 若是bean實現了InitializingBean接口,spring將調用它的afterPropertiesSet接口方法,相似的若是bean使用了init-method屬性聲明瞭初始化方法,該方法也會被調用;blog

  • 若是bean實現了BeanPostProcessor接口,它的postProcessAfterInitialization接口方法將被調用;接口

  • 此時bean已經準備就緒,能夠被應用程序使用了,他們將一直駐留在應用上下文中,直到該應用上下文被銷燬;生命週期

  • 若bean實現了DisposableBean接口,spring將調用它的distroy()接口方法。一樣的,若是bean使用了destroy-method屬性聲明瞭銷燬方法,則該方法被調用;

  

 

spring對單例和多例bean的管理
      一、單例管理的對象
         當scope=」singleton」,即默認狀況下,會在啓動容器時(即實例化容器時)時實例化。但咱們能夠指定Bean節點的lazy-init=」true」來               延遲初始化bean,這時候,只有在第一次獲取bean時纔會初始化bean,即第一次請求該bean時才初始化。
     二、非單例管理的對象
         當scope=」prototype」時,容器也會延遲初始化bean,Spring讀取xml文件的時候,並不會馬上建立對象,而是在第一次請求該bean時               才初始化(如調用getBean方法時)。在第一次請求每個prototype的bean時,Spring容器都會調用其構造器建立這個對象,而後調                 用init-method屬性值中所指定的方法。對象銷燬的時候,Spring容器不會幫咱們調用任何方法,由於是非單例,這個類型的對象有不少               個,Spring容器一旦把這個對象交給你以後,就再也不管理這個對象了。

 

 

參考:https://blog.csdn.net/fuzhongmin05/article/details/73389779

相關文章
相關標籤/搜索