spring的bean週期中BeanPostProcessor淺析
阿新 • • 發佈:2018-11-14
參考: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屬性進行設定優先順序。