今天有讀者朋友反饋在調試本書15章的源碼時出現“BeanPostProcessorChecker:xxx is not eligible for getting processed by all BeanPostProcessors”的INFO級別的提示,該讀者想知道該錯誤出現的原因。相關提示,如下圖所示。
提示的解答:
該信息提示的意思是:BeanPostProcessorChecker檢查到xxx不適合所有的BeanPostProcessor來處理。即,存在出現“自動注入”不合適或無效的信息。
是否爲錯誤:
對於INFO級別的輸出信息來說,一般情況下並不算錯誤,WARN級別的也不算錯誤,這其實只是警告。
出現原因:
雖然不是錯誤,但是我們需要找到原因。
1. 什麼是BeanPostProcessor
在瞭解出現提示的原因之前,我們先來了解什麼是BeanPostProcessor。
BeanPostProcessor是Spring的Bean工廠中的鉤子(Hook),允許Spring框架在新創建Bean實例時對其進行定製化修改。它本身也是一個Bean,在通常情況下,其實例化順序要優先於普通的Bean。因爲有時BeanPostProcessor也會依賴一些Bean,所以,會存在一些普通Bean的實例化早於BeanPostProcessor的情況,因此就會造成一些問題。
2. 出現這個提示的原因
有些Bean不是被所有BeanPostProcessor處理過
些Bean不是被BeanFactory註冊的所有BeanPostProcessor處理過,BeanPostProcessor控制Bean初始化開始和初始化結束的接口。實現BeanPostProcessor的Bean會在其他Bean初始化之前完成,BeanPostProcessor會通過接口方法檢查其他類型的Bean並做處理。通常auto-proxy只是針對部分Bean的進行處理的,所以某個Bean不被“完全”處理也很正常。
存在沒有實現接口的Bean或FactoryBean
有些BeanPostProcessor不處理沒有實現接口的Bean或FactoryBean。