獲取spring的ApplicationContext幾種方式
一種是實現ApplicationContextAware
接口,一種是跟普通的自動注入一樣。
下面是Spring高版本才提供的:
記住只能有一個構造函數,上面有兩個構造函數是錯誤,隨意刪除一個即可。同時注意有
User
參數的構造函數,必須在Spring容器有User
類型的對象才行。
探討ApplicationContextAware
的實現原理——BeanPostProcessor
記住一定要交給Spring管理。
BeanPostProcessor
中的postProcessBeforeInitialization
方法會在類實例化并且設置完屬性之后調用,而postProcessAfterInitialization
會在init
方法調用之后調用。現在寫個例子來測試一下:
下面是一個Book
類:
開始測試:
運行結果:
請注意輸出,你看到的不是一次
TestBeanPostProcessor
相關方法的執行,而是三次,為什么?因為Spring也會初始化一些bean,在初始化這些Bean的時候也會調用實現BeanPostProcessor
的類的相應方法。
探討ApplicationContextAware
的實現原理——BeanPostProcessor
的用處——實現代理
下面是一個BeanPostProcessor
接口的類:
請注意上面兩個方法都返回另一個對象。
看看最后能不能返回LogDog2
類型的對象。
探討ApplicationContextAware
的實現原理——使用BeanPostProcessor
實現ApplicationContextAware
定義一個接口:
實現MyApplicationContextAware
接口的Cat
類:
MyApplicationContext
的BeanPostProcessor
:
這就是為什么只要實現一個接口就可以實現屬性注入的原理: