2015-04-20 35 views
43

我正在學習Spring Core認證,我對Spring如何處理豆生命週期,特別是關於豆後期處理器存在一些懷疑。Spring bean後期處理器的工作原理如何?

所以我有這樣的模式:

enter image description here

這對我來說是很清楚這意味着什麼:

進入加載bean定義階段發生的是:

  • @Configuration類是進程ed和/或@組件是 掃描的和/或XML文件被解析。

  • 加入的BeanFactory豆定義(其ID下的每個索引)

  • 特別的BeanFactoryPostProcessor豆調用時,它可以修改任何bean的定義(例如用於財產佔位符值替換)。

然後在豆創建階段恰巧:

  • 每個bean急切默認實例(按正確的順序創造了它的依賴注入)。

  • 在依賴注入之後,每個bean都會經過後期處理 階段,在該階段中可能會發生進一步的配置和初始化。

  • 經過後處理的bean被完全初始化並準備使用(通過其ID追蹤,直到上下文被銷燬)

好吧,這對我來說是很清楚的,我也知道,有兩種類型的bean後置處理器的是:

  • 初始值設定:如果指示初始化豆(即@PostConstruct)。

  • 其餘全部:,允許額外的配置和之前或初始化步驟

後運行,並且我張貼這張幻燈片:

enter image description here

所以對我來說非常清楚初始化程序 bean post pr (它們是用註釋方法註解的方法,並且在setter方法之後立即被自動調用(所以在依賴注入之後),並且我知道我可以用來執行一些初始化批處理(就像在前面的例子)。

但是究竟代表了其他bean後期處理器?什麼意思是在初始化階段之前或之後執行

所以我的bean被實例化,並執行依賴注入,然後初始化階段被執行(通過執行一個註解方法)。什麼意思是在初始化階段之前執行Bean Post Processor?這意味着它發生在註釋的方法執行之前嗎?所以int意味着它可能發生在依賴注入之前(在調用setter方法之前)?

究竟意味着它在初始化步驟後執行。這意味着它發生後,執行一個@PostContruct註釋的方法,或者什麼?

我可以輕易猜出了我的頭上,爲什麼我需要一個@PostContruct annoted方法,但我想不出其他類型bean後置處理器的一些典型的例子,你能告訴我在使用時的一些典型例子?

TNX

回答

23

春DOC Customizing beans using BeanPostProcessor下解釋了龍鼓灘發電廠。 BPP bean是一種特殊的bean,在任何其他bean之前創建並與新創建的bean進行交互。通過這個構造,Spring爲您提供了通過簡單地實現自己的BeanPostProcessor來連接和自定義生命週期行爲的方法。

有一個自定義的BPP像

public class CustomBeanPostProcessor implements BeanPostProcessor { 

    public CustomBeanPostProcessor() { 
     System.out.println("0. Spring calls constructor"); 
    } 

    @Override 
    public Object postProcessBeforeInitialization(Object bean, String beanName) 
      throws BeansException { 
     System.out.println(bean.getClass() + " " + beanName); 
     return bean; 
    } 

    @Override 
    public Object postProcessAfterInitialization(Object bean, String beanName) 
      throws BeansException { 
     System.out.println(bean.getClass() + " " + beanName); 
     return bean; 
    } 
} 

將被稱爲並打印出類和bean名稱爲每個創建的bean。

要undersand方法如何適應bean的生命週期,以及什麼時候該方法的被調用檢查docs

postProcessBeforeInitialization(對象豆,字符串beanName)應用 這個BeanPostProcessor的給定新的bean實例在任何bean初始化回調之前(例如InitializingBean的afterPropertiesSet 或自定義init方法)。

postProcessAfterInitialization(對象豆,字符串beanName)應用 這個BeanPostProcessor的給定新的bean實例的bean 初始化回調後(的是類似InitializingBean的afterPropertiesSet方法 或者自定義的初始化方法)。

最重要的一點還在於

bean將已經與屬性值填充。

對於所關注與@PostConstruct注意,這個註釋聲明postProcessAfterInitialization方法的一種便捷方式,當你無論是註冊CommonAnnotationBeanPostProcessor或bean配置文件中指定<context:annotation-config />春意識到它的關係。無論@PostConstruct方法之前,或任何其他postProcessAfterInitialization後執行依賴於order財產

可以配置多個BeanPostProcessor的情況下,你可以 控制這些BeanPostProcessor的設置 順序財產的執行順序。

15

豆類後期處理器的典型例子是當你想要將原始bean包裝在代理實例中時,當使用@Transactional註釋。

bean post處理器將交給bean的原始實例,它可以調用目標上的任何方法,但它也會返回應該在應用程序上下文中綁定的實際bean實例,這意味着它實際上可以返回任何想要的對象。當這種情況很有用時,典型場景是bean後期處理器將目標包裝在代理實例中。對綁定在應用上下文中的bean的所有調用將通過代理,然後代理在調用目標bean之前和/或之後執行一些魔術,例如, AOP或交易管理。

+2

一個真實的例子的榮譽! – raiks

+0

感謝您提供實際使用案例,而不僅僅是理論 –

0

區別是BeanPostProcessor將掛鉤上下文初始化,然後調用postProcessBeforeInitializationpostProcessAfterInitialization所有定義的bean。

但是@PostConstruct僅用於想要在構造函數或set方法之後定製bean創建的特定類。

相關問題