1. 程式人生 > >Spring Bean的初始化過程

Spring Bean的初始化過程

Bean 的初始化過程

    一個類同時實現了 BeanNameAware, BeanFactoryAware, ApplicationContextAware, BeanPostProcessor, InitializingBean, DisposableBean介面時,Bean 的初始化過程為:.

  1. 呼叫 BeanNameAwaresetBeanName 方法
  2. 呼叫 BeanFactoryAwaresetBeanFactory 方法
  3. 呼叫 ApplicationContextAwaresetApplicationContext
  4. 呼叫 InitializingBean
    afterPropertiesSet 或者沒有實現這個介面,但指定了@Bean(initMethod="不加括號的方法名"),會執行這個方法
  5. 呼叫 BeanPostProcessorpostProcessBeforeInitialization 方法
  6. 呼叫 BeanPostProcessorpostProcessAfterInitialization 方法
  7. Bean 初始化完成,可以被使用
  8. 容器關閉前,呼叫 DisposableBeandestroy 方法

    但是在整個系統中,BeanPostProcessor的實現類只需要有一個即可,Spring 檢測到它的存在時,每個 Bean 被初始化時,都會呼叫它的方法。注意,是所有 Bean 都會呼叫它的方法。
    如果一個類除BeanPostProcessor

外,實現了其他的介面,有另外一個類單獨實現了BeanPostProcessor介面,那麼上面的初始化過程中,第 4 步和第 5 步調換位置。

自測結果:

# Aware 的子介面的順序跟下面的一致
BeanNameAware...setBeanName
BeanFactoryAware...setBeanFactory
ApplicationContextAware...setApplicationContext
InitializingBean...afterPropertiesSet
BeanPostProcessor...postProcessBeforeInitialization
BeanPostProcessor...postProcessAfterInitialization com.p7.boot.test.Clazz@2abf4075 DisposableBean...destroy

Bean 實現的介面解析

import org.springframework.beans.factory.BeanNameAware;
public void setBeanName(String beanName) {
    // 在當前類中可以獲取到當前 Bean 的名字
}

import org.springframework.beans.factory.BeanFactoryAware;
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
    // 在當前類中可以獲取到 BeanFactory 例項
}

import org.springframework.context.ApplicationContextAware;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    // 在當前類中可以獲取到 ApplicationContext 例項
}

import org.springframework.beans.factory.InitializingBean;
public void afterPropertiesSet() throws Exception {
    // initMethod 方法
}

import org.springframework.beans.factory.DisposableBean;
public void destroy() throws Exception {
    // destroyMethod 方法
}

import org.springframework.beans.factory.config.BeanPostProcessor;
public Object postProcessAfterInitialization(Object bean, String arg1) throws BeansException {
    // 可以對物件進行加工,比如說加個初始化 Bean 時的開始時間
    return bean;
}
public Object postProcessBeforeInitialization(Object bean, String arg1) throws BeansException {
    // 可以對物件進行加工,比如說加個初始化 Bean 時的結束時間
    return bean;
}