bean的載入(四)從bean的例項中獲取物件
在getBean方法中,getObjectForBeanInstance是個頻繁使用的方法,無論是從快取中獲得bean還是根據不同的scope策略載入bean.總之,我們得到bean的例項後,要做的第一步就是呼叫這個方法來檢測一下正確性,其實就是檢測獲得Bean是不是FactoryBean型別的bean,如果是,那麼需要呼叫該bean對應的FactoryBean例項中的getObject()作為返回值。
無論是從快取中獲取到的bean還是通過不同的scope策略載入的bean都只是最原始的bean狀態,並不一定是我們最終想要的bean.舉個例子,加入我們需要對工廠bean進行的處理,那麼這裡得到的其實是工廠bean的初始狀態,但我們真正想要的是工廠bean中定義的factory-method方法中返回的bean,而getObjectForBeanInstance方法就是完成這個。
這個方法中沒有太多重要資訊,大多是輔助程式碼以及一些功能性判斷,而真正的核心程式碼委託給了getObjectFromFactoryBean:
在這段程式碼中,沒有太多東西,基本上做了一件事情,就是如果返回的bean是單例的,就必須保證全域性唯一,同時不可重複建立,可以使用快取來提高效能,也就是說載入過就記錄下來以便於下次複用。而在doGetObjectFromFactoryBean我們看到了想要的方法,就是Object=factory.getObejct().
以前我們曾經介紹過FactoryBean的呼叫方法,如果bean宣告為FactoryBean型別,則當提取bean時候提取的不是FactoryBean,而是FactoryBean中對應的getObject方法返回的bean,而doGetObjectFromFactroyBean真是實現這個功能。而呼叫完doGetObjectFromFactoryBean方法後,並沒有直接返回,getObjectFromFactoryBean方法中還呼叫了object = postProcessObjectFromFactoryBean(object, beanName);方法,在子類AbstractAutowireCapableBeanFactory,有這個方法的實現:
對於後處理器的使用,我們目前還沒接觸,後續會有大量篇幅介紹,這裡我們只需要瞭解在Spring獲取bean的規則中有這樣一條:儘可能保證所有bean初始化後都會呼叫註冊的BeanPostProcessor的postProcessAfterInitialization方法進行處理,在實際開發過程中大可以針對此特性設計自己的業務處理