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()方法