在spring實例化 之前bean對象封裝成 beanDefinition 對象 想瞭解詳情的請參考上一篇文章 好了 我們聊聊 Bean 的實例化過程的幾個重要角色 BeanDefinitionRegistryPostProcessor 介面 Refresh().invokeBeanFactoryP ...
在spring實例化 之前bean對象封裝成 beanDefinition 對象 想瞭解詳情的請參考上一篇文章
好了 我們聊聊 Bean 的實例化過程的幾個重要角色 BeanDefinitionRegistryPostProcessor 介面 Refresh().invokeBeanFactoryPostProcessors 這個方法裡面。 BeanDefinitionRegistryPostProcessor 這個介面的調用分為三部: 1、調用實現了 PriorityOrdered 排序介面 2、調用實現了 Ordered 排序介面 3、沒有實現介面的調用 這個介面我的理解:獲取 BeanDefinitionRegistry 對象,獲取到這個對象就可以獲取這個對象中註冊的 所有 BeanDefinition 對象,所以我們知道了,我們擁有這個對象就可以完成裡面所有 BeanDefinition 對 象的修改新增操作BeanPostProcessor 的註冊 Refresh().registerBeanPostProcessors 這個方法裡面。 拿到 BeanFactory 中所有註冊的 BeanDefinition 對象的名稱 beanName。 然後判斷是否實現了 PriorityOrdered 排序介面,Ordered 排序介面,getBean 是將 該 ppName 對應的 BeanDefinition 對象實例化。 把對應的 BeanPostProcessor 對象註冊到 BeanFactory 中,BeanFactory 中有一個 list 容器接收。 getSingleton 方法 代碼位置: AbstractBeanFactory.doGetBean 方法中
方法裡面核心要點:
把 beanName 添加到 singletonsCurrentlyInCreation Set 容器中,在這個集合里 面的 bean 都是正在實例化的 bean,就是實例化還沒做完的 BeanName 調到 getObject 方法,完成 bean 的實例化。接下來
getObject 調用完後,就代表著 Bean 實例化已經完成了,這時候就需要 1、singletonsCurrentlyInCreation 把 beanName 從這個集合中刪除 2、addSingleton,把 bean 緩存到一級緩存中 createBean 方法 代碼位置: AbstractBeanFactory.doGetBean 方法中
這個方法是 bean 實例化核心方法
實例化方法,把 bean 實例化,並且包裝成 BeanWrapper 點進這個方法裡面。
這個方法是反射調用類中的 factoryMethod 方法。這要知道@Bean 方法的原理,實際上 spring 會掃描有@bean 註解的方法,然後把方法名稱設置到 BeanDefinition 的 factoryMethod 屬性中,接下來就會調到上面截圖中的方法實現@Bean 方法的調用。該方法裡面的參數解 析過程不需要瞭解。
determineConstructorsFromBeanPostProcessors 這個方法是 BeanPostProcessor 介面類的首次應用,最終會掉到 AutowiredAnnotationBeanPostProcessor 類的方法,在方法中會掃描有註解的構造函數然後完 成裝配過程。