在spring實例化 之前bean對象封裝成 beanDefinition 對象 想瞭解詳情的請參考上一篇文章 好了 我們聊聊 Bean 的實例化過程的幾個重要角色 BeanDefinitionRegistryPostProcessor 介面 Refresh().invokeBeanFactoryP ...
在spring實例化 之前bean對象封裝成 beanDefinition 對象 想瞭解詳情的請參考上一篇文章
好了 我們聊聊 Bean 的實例化過程的幾個重要角色 BeanDefinitionRegistryPostProcessor 介面 Refresh().invokeBeanFactoryPostProcessors 這個方法裡面。 BeanDefinitionRegistryPostProcessor 這個介面的調用分為三部: 1、調用實現了 PriorityOrdered 排序介面 2、調用實現了 Ordered 排序介面 3、沒有實現介面的調用 這個介面我的理解:獲取 BeanDefinitionRegistry 對象,獲取到這個對象就可以獲取這個對象中註冊的 所有 BeanDefinition 對象,所以我們知道了,我們擁有這個對象就可以完成裡面所有 BeanDefinition 對 象的修改新增操作![](https://img2018.cnblogs.com/i-beta/1893708/202001/1893708-20200109100155613-761565126.png)
BeanPostProcessor 的註冊 Refresh().registerBeanPostProcessors 這個方法裡面。
![](https://img2018.cnblogs.com/i-beta/1893708/202001/1893708-20200109100244984-805654425.png)
![](https://img2018.cnblogs.com/i-beta/1893708/202001/1893708-20200109100315926-1299953074.png)
![](https://img2018.cnblogs.com/i-beta/1893708/202001/1893708-20200109100355260-138835781.png)
![](https://img2018.cnblogs.com/i-beta/1893708/202001/1893708-20200109100522791-1753119437.png)
方法裡面核心要點:
![](https://img2018.cnblogs.com/i-beta/1893708/202001/1893708-20200109100542675-264733962.png)
![](https://img2018.cnblogs.com/i-beta/1893708/202001/1893708-20200109100627350-243367294.png)
![](https://img2018.cnblogs.com/i-beta/1893708/202001/1893708-20200109100701780-1225582922.png)
getObject 調用完後,就代表著 Bean 實例化已經完成了,這時候就需要 1、singletonsCurrentlyInCreation 把 beanName 從這個集合中刪除 2、addSingleton,把 bean 緩存到一級緩存中
![](https://img2018.cnblogs.com/i-beta/1893708/202001/1893708-20200109100727787-608995521.png)
![](https://img2018.cnblogs.com/i-beta/1893708/202001/1893708-20200109100815482-115795365.png)
這個方法是 bean 實例化核心方法
實例化方法,把 bean 實例化,並且包裝成 BeanWrapper 點進這個方法裡面。
![](https://img2018.cnblogs.com/i-beta/1893708/202001/1893708-20200109100938098-818470089.png)
這個方法是反射調用類中的 factoryMethod 方法。這要知道@Bean 方法的原理,實際上 spring 會掃描有@bean 註解的方法,然後把方法名稱設置到 BeanDefinition 的 factoryMethod 屬性中,接下來就會調到上面截圖中的方法實現@Bean 方法的調用。該方法裡面的參數解 析過程不需要瞭解。
![](https://img2018.cnblogs.com/i-beta/1893708/202001/1893708-20200109101011549-450573569.png)
determineConstructorsFromBeanPostProcessors 這個方法是 BeanPostProcessor 介面類的首次應用,最終會掉到 AutowiredAnnotationBeanPostProcessor 類的方法,在方法中會掃描有註解的構造函數然後完 成裝配過程。