1. 程式人生 > >spring的bean週期中BeanPostProcessor淺析

spring的bean週期中BeanPostProcessor淺析

參考:https://www.cnblogs.com/sishang/p/6576665.html

1. 基本概念

spring容器在例項化bean之後(通過構造器建立物件並注入屬性值即為例項化),可以使用BeanPostProcessor介面在bean的初始化方法前後根據需要做自己的邏輯處理。

2. BeanPostProcessor後置處理器的使用

BeanPostProcessor介面有兩個方法,postProcessBeforeInitialization和postProcessAfterInitialization,預設情況下後置處理器會處理容器中所有的bean。

postProcessBeforeInitialization在bean初始化方法之前呼叫,初始化方法包括:bean標籤新增init-method屬性指定Java類中初始化方法、 @PostConstruct註解指定初始化方法,Java類實現InitailztingBean介面所產生的afterPropertiesSet()方法等。

postProcessAfterInitialization在bean初始化方法之後呼叫。

public class PostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean,
            String beanName) throws BeansException {
        if ("narCodeService".equals(beanName)) {//此方法獲取容器中所有的bean,根據 beanName 名稱選擇要處理的bean,此處過濾例項ID為narCodeService
            
            return bean;
        }
        System.out.println("後置處理器處理bean=【"+beanName+"】開始");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean,
            String beanName) throws BeansException {
        if ("narCodeService".equals(beanName)) {
            return bean;
        }
        System.out.println("後置處理器處理bean=【"+beanName+"】完畢!");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return bean;
    }

}

上段程式碼兩個方法的第一個引數為bean物件,第二個引數為bean物件的全稱名稱(包名加類名)。然後該實現類配置在spring配置檔案中就可以使用了。多個後置處理器按照配置順序執行,可以配置order屬性進行設定優先順序。