生命周期概覽
Spring Bean 的生命周期可以分為以下階段:
-
實例化:Spring 容器根據 Bean 的定義創(chuàng)建一個 Bean 的實例。這個階段主要涉及 Bean 的實例化和依賴注入。
相關類:InstantiationAwareBeanPostProcessor、BeanFactoryPostProcessor、BeanPostProcessor、BeanWrapper、DefaultListableBeanFactory 等。
-
屬性賦值:所有的 Bean 屬性被設置為配置值或者默認值,這個階段主要涉及 Bean 的屬性填充。
相關類:InstantiationAwareBeanPostProcessor、BeanFactoryPostProcessor、BeanPostProcessor、BeanWrapper、DefaultListableBeanFactory 等。
-
初始化前:調用 @PostConstruct 和 InitializingBean 的實現(xiàn)方法,以及自定義的初始化方法。
相關類:InstantiationAwareBeanPostProcessor、BeanFactoryPostProcessor、BeanPostProcessor、InitializingBean、AbstractAutowireCapableBeanFactory 等。
-
初始化后:調用 BeanPostProcessor 的 postProcessAfterInitialization 方法,以及自定義的初始化方法。
相關類:InstantiationAwareBeanPostProcessor、BeanFactoryPostProcessor、BeanPostProcessor、AbstractAutowireCapableBeanFactory 等。
-
銷毀前:調用 @PreDestroy 和 DisposableBean 的實現(xiàn)方法,以及自定義的銷毀方法。
相關類:DisposableBean、AbstractAutowireCapableBeanFactory 等。
-
銷毀:Spring 容器銷毀 Bean 對象,釋放資源。
相關類:DisposableBean、AbstractAutowireCapableBeanFactory 等。
其中,InstantiationAwareBeanPostProcessor、BeanFactoryPostProcessor、BeanPostProcessor 是 Spring Framework 中常用的擴展點,用于在 Bean 的生命周期中攔截和處理 Bean 對象。AbstractAutowireCapableBeanFactory 是 Spring Framework 中的一個重要實現(xiàn)類,實現(xiàn)了 Bean 對象的創(chuàng)建、屬性注入、初始化和銷毀等功能。DefaultListableBeanFactory 則是 AbstractAutowireCapableBeanFactory 的子類,實現(xiàn)了 Bean 的注冊和查找等功能。
主要類的作用和常用方法的詳細說明
-
BeanFactoryPostProcessor
接口
該接口的作用是在 Spring 容器初始化之后,但是在 Bean 實例化之前,對 BeanFactory 進行修改。它提供了一個方法 postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
,該方法可以實現(xiàn)對 BeanFactory 的配置元數(shù)據進行修改,例如添加新的 BeanDefinition 等。
常用方法:
-
postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
: 該方法在 BeanFactory 標準初始化之后、任何 bean 被實例化之前被調用??梢酝ㄟ^該方法修改 BeanFactory 的配置元數(shù)據,例如添加新的 BeanDefinition 等。
-
BeanPostProcessor
接口
該接口的作用是在 Spring 容器完成 Bean 實例化和屬性注入之后,但是在調用 Bean 的初始化方法之前和之后,對 Bean 實例進行自定義的初始化和銷毀操作。它提供了兩個方法 postProcessBeforeInitialization(Object bean, String beanName)
和 postProcessAfterInitialization(Object bean, String beanName)
,分別對應 Bean 初始化前和初始化后的操作。
常用方法:
-
postProcessBeforeInitialization(Object bean, String beanName)
: 該方法在 Bean 對象實例化后、依賴注入完成后、初始化方法調用之前被調用。可以在該方法中自定義 Bean 對象的初始化邏輯。 -
postProcessAfterInitialization(Object bean, String beanName)
: 該方法在 Bean 對象實例化后、依賴注入完成后、初始化方法調用之后被調用。可以在該方法中自定義 Bean 對象的銷毀邏輯。
-
InstantiationAwareBeanPostProcessor
接口
該接口繼承了 BeanPostProcessor
接口,增加了對 Bean 實例化前的處理方法 postProcessBeforeInstantiation(Class<?> beanClass, String beanName)
和對屬性進行修改的方法 postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)
。
常用方法:
-
postProcessBeforeInstantiation(Class<?> beanClass, String beanName)
: 該方法在 Bean 對象實例化之前被調用,可以在該方法中返回一個代理對象來替代原始的 Bean 對象實例。 -
postProcessAfterInstantiation(Object bean, String beanName)
: 該方法在 Bean 對象實例化之后、依賴注入完成之后、初始化方法調用之前被調用??梢栽谠摲椒ㄖ懈嬷?Spring 容器是否需要繼續(xù)對該 Bean 對象進行屬性注入和初始化等操作。 -
postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)
: 該方法在 Bean 對象的屬性填充之后、初始化方法調用之前被調用??梢栽谠摲椒ㄖ行薷?Bean 對象的屬性值。
-
InitializingBean
接口
該接口提供了一個方法 afterPropertiesSet()
,在 Bean 對象的所有屬性被設置完畢之后調用??梢栽谠摲椒ㄖ凶远x Bean 對象的初始化邏輯。
常用方法:
-
afterPropertiesSet()
: 該方法在 Bean 對象的所有屬性被設置完畢之后調用??梢栽谠摲椒ㄖ凶远x Bean 對象的初始化邏輯。
-
DisposableBean
接口
該接口提供了一個方法 destroy()
,在 Bean 對象被銷毀之前調用??梢栽谠摲椒ㄖ凶远x Bean 對象的銷毀邏輯。
常用方法:
-
destroy()
: 該方法在 Bean 對象被銷毀之前調用。可以在該方法中自定義 Bean 對象的銷毀邏輯。
-
AbstractAutowireCapableBeanFactory
類
該類是 Spring Bean Factory 的一個抽象實現(xiàn),提供了創(chuàng)建 Bean 對象、屬性注入、初始化和銷毀等方法的默認實現(xiàn),可以用于定制自己的 Bean Factory 實現(xiàn)。
常用方法:
-
createBean(Class<T> beanClass)
: 根據指定的類型創(chuàng)建一個 Bean 對象。 -
doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
: 根據指定的 BeanDefinition 和構造函數(shù)參數(shù)創(chuàng)建一個 Bean 對象。 -
applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
: 在 Bean 的初始化方法調用之前,對 Bean 進行后置處理。 -
applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
: 在 Bean 的初始化方法調用之后,對 Bean 進行后置處理。 -
destroyBean(Object bean)
: 銷毀指定的 Bean 對象,包括調用DisposableBean
接口的destroy()
方法和自定義的銷毀邏輯。
-
AbstractBeanFactory
類
該類是 BeanFactory
接口的抽象實現(xiàn),提供了創(chuàng)建 Bean 對象、獲取 Bean 對象、Bean 的生命周期管理等方法的默認實現(xiàn)。
常用方法:
-
containsBean(String name)
: 判斷是否存在指定名稱的 Bean 對象。 -
getType(String name)
: 獲取指定名稱的 Bean 對象的類型。 -
getBean(String name)
: 根據指定名稱獲取一個 Bean 對象。 -
getBean(String name, Class<T> requiredType)
: 根據指定名稱和類型獲取一個 Bean 對象。 -
getBeanDefinition(String beanName)
: 獲取指定名稱的 BeanDefinition 對象。 -
registerSingleton(String name, Object singletonObject)
: 注冊一個單例 Bean 對象。 -
destroySingletons()
: 銷毀所有的單例 Bean 對象,包括調用DisposableBean
接口的destroy()
方法和自定義的銷毀邏輯。
-
ConfigurableBeanFactory
接口
該接口是 BeanFactory
接口的子接口,增加了對 Bean 的生命周期管理的方法,例如添加 BeanPostProcessor、添加 BeanFactoryPostProcessor 等。
常用方法:
-
addBeanPostProcessor(BeanPostProcessor beanPostProcessor)
: 添加一個 BeanPostProcessor。 -
addBeanFactoryPostProcessor(BeanFactoryPostProcessor beanFactoryPostProcessor)
: 添加一個 BeanFactoryPostProcessor。 -
registerAlias(String beanName, String alias)
: 注冊一個 Bean 別名。
-
ApplicationContext
接口
該接口是 Spring 應用上下文的核心接口,擴展了 BeanFactory
接口,提供了更多的應用上下文級別的功能,例如事件發(fā)布、國際化支持等。
常用方法:
-
getBean(String name)
: 根據指定名稱獲取一個 Bean 對象。 -
getBean(Class<T> requiredType)
: 根據指定類型獲取一個 Bean 對象。 -
publishEvent(ApplicationEvent event)
: 發(fā)布一個應用事件。 -
getMessage(String code, Object[] args, String defaultMessage, Locale locale)
: 獲取國際化信息。
釋疑
InstantiationAwareBeanPostProcessor
和 BeanPostProcessor
接口的主要區(qū)別在于方法的調用時機和提供的回調方法的不同。
BeanPostProcessor
接口提供了兩個回調方法 postProcessBeforeInitialization
和 postProcessAfterInitialization
,用于在 Bean 初始化前和初始化后對 Bean 進行自定義的初始化和銷毀操作。
而 InstantiationAwareBeanPostProcessor
接口繼承了 BeanPostProcessor
接口,并且提供了三個額外的回調方法,用于在 Bean 實例化前、實例化后和屬性填充后對 Bean 進行自定義的處理:
-
postProcessBeforeInstantiation
: 在 Bean 實例化之前調用,可以返回一個代理對象來替代原始的 Bean 對象實例。 -
postProcessAfterInstantiation
: 在 Bean 實例化之后、依賴注入完成之后、初始化方法調用之前被調用。可以在該方法中告知 Spring 容器是否需要繼續(xù)對該 Bean 對象進行屬性注入和初始化等操作。 -
postProcessPropertyValues
: 在 Bean 對象的屬性填充之后、初始化方法調用之前被調用??梢栽谠摲椒ㄖ行薷?Bean 對象的屬性值。文章來源:http://www.zghlxwxcb.cn/news/detail-555820.html
因此,相較于 BeanPostProcessor
接口,InstantiationAwareBeanPostProcessor
接口提供了更多的回調方法,使得我們可以在更多的時機進行自定義的處理。一般情況下,如果只需要在 Bean 的初始化前和初始化后進行自定義的處理,可以直接實現(xiàn) BeanPostProcessor
接口;如果需要在更多的時機進行自定義處理,可以實現(xiàn) InstantiationAwareBeanPostProcessor
接口。文章來源地址http://www.zghlxwxcb.cn/news/detail-555820.html
到了這里,關于Spring窺探系列之Bean生命周期(100%GPT生成版)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!