spring — bean的生命週期(一)

1.生命週期流程圖:

在這裏插入圖片描述
Spring Bean的完整生命週期從創建Spring容器開始,直到最終Spring容器銷燬Bean,這其中包含了一系列關鍵點:
在這裏插入圖片描述

2.Bean 的生命週期

如上圖所示,Bean 的生命週期還是比較複雜的,下面來對上圖每一個步驟做文字描述:

  • 1.Spring啓動,查找並加載需要被Spring管理的bean,進行Bean的實例化

  • 2.Bean實例化後對將Bean的引入和值注入到Bean的屬性中

  • 3.如果Bean實現了BeanNameAware接口的話,Spring將Bean的Id傳遞給setBeanName()方法

  • 4.如果Bean實現了BeanFactoryAware接口的話,Spring將調用setBeanFactory()方法,將BeanFactory容器實例傳入

  • 5.如果Bean實現了ApplicationContextAware接口的話,Spring將調用Bean的setApplicationContext()方法,將bean所在應用上下文引用傳入進來。

  • 6.如果Bean實現了BeanPostProcessor接口,Spring就將調用他們的postProcessBeforeInitialization()方法。

  • 7.如果Bean 實現了InitializingBean接口,Spring將調用他們的afterPropertiesSet()方法。類似的,如果bean使用init-method聲明瞭初始化方法,該方法也會被調用

  • 8.如果Bean 實現了BeanPostProcessor接口,Spring就將調用他們的postProcessAfterInitialization()方法。

  • 9.此時,Bean已經準備就緒,可以被應用程序使用了。他們將一直駐留在應用上下文中,直到應用上下文被銷燬。

  • 10.如果bean實現了DisposableBean接口,Spring將調用它的destory()接口方法,同樣,如果bean使用了destory-method 聲明銷燬方法,該方法也會被調用。

3.具體過程流程圖:

在這裏插入圖片描述
初始化

1.BeanNameAware.setBeanName() 在創建此bean的bean工廠中設置bean的名稱,在普通屬性設置之後調用,在InitializinngBean.afterPropertiesSet()方法之前調用

2.BeanClassLoaderAware.setBeanClassLoader(): 在普通屬性設置之後,InitializingBean.afterPropertiesSet()之前調用

3.BeanFactoryAware.setBeanFactory() : 回調提供了自己的bean實例工廠,在普通屬性設置之後,在InitializingBean.afterPropertiesSet()或者自定義初始化方法之前調用

4.EnvironmentAware.setEnvironment(): 設置environment在組件使用時調用

5.EmbeddedValueResolverAware.setEmbeddedValueResolver(): 設置StringValueResolver 用來解決嵌入式的值域問題

6.ResourceLoaderAware.setResourceLoader(): 在普通bean對象之後調用,在afterPropertiesSet 或者自定義的init-method 之前調用,在 ApplicationContextAware 之前調用。

7.ApplicationEventPublisherAware.setApplicationEventPublisher(): 在普通bean屬性之後調用,在初始化調用afterPropertiesSet 或者自定義初始化方法之前調用。在 ApplicationContextAware 之前調用。

8.MessageSourceAware.setMessageSource(): 在普通bean屬性之後調用,在初始化調用afterPropertiesSet 或者自定義初始化方法之前調用,在 ApplicationContextAware 之前調用。

9.ApplicationContextAware.setApplicationContext(): 在普通Bean對象生成之後調用,在InitializingBean.afterPropertiesSet之前調用或者用戶自定義初始化方法之前。在ResourceLoaderAware.setResourceLoader,ApplicationEventPublisherAware.setApplicationEventPublisher,MessageSourceAware之後調用。

10.ServletContextAware.setServletContext(): 運行時設置ServletContext,在普通bean初始化後調用,在InitializingBean.afterPropertiesSet之前調用,在 ApplicationContextAware 之後調用注:是在WebApplicationContext 運行時

11.BeanPostProcessor.postProcessBeforeInitialization() : 將此BeanPostProcessor 應用於給定的新bean實例 在任何bean初始化回調方法(像是InitializingBean.afterPropertiesSet或者自定義的初始化方法)之前調用。這個bean將要準備填充屬性的值。返回的bean示例可能被普通對象包裝,默認實現返回是一個bean。

12.BeanPostProcessor.postProcessAfterInitialization() : 將此BeanPostProcessor 應用於給定的新bean實例 在任何bean初始化回調方法(像是InitializingBean.afterPropertiesSet或者自定義的初始化方法)之後調用。這個bean將要準備填充屬性的值。返回的bean示例可能被普通對象包裝

13.InitializingBean.afterPropertiesSet(): 被BeanFactory在設置所有bean屬性之後調用(並且滿足BeanFactory 和 ApplicationContextAware)。

銷燬

在BeanFactory 關閉的時候,Bean的生命週期會調用如下方法:

  • 1.DestructionAwareBeanPostProcessor.postProcessBeforeDestruction(): 在銷燬之前將此BeanPostProcessor 應用於給定的bean實例。能夠調用自定義回調,像是DisposableBean 的銷燬和自定義銷燬方法,這個回調僅僅適用於工廠中的單例bean(包括內部bean)

  • 2.實現了自定義的destory()方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章