您好,登錄后才能下訂單哦!
這篇文章主要介紹Spring bean對象實例化的案例分析,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
好了 我們聊聊 Bean 的實例化過程的幾個重要角色
BeanDefinitionRegistryPostProcessor 接口
Refresh().invokeBeanFactoryPostProcessors 這個方法里面。
BeanDefinitionRegistryPostProcessor 這個接口的調(diào)用分為三部:
1、調(diào)用實現(xiàn)了 PriorityOrdered 排序接口
2、調(diào)用實現(xiàn)了 Ordered 排序接口
3、沒有實現(xiàn)接口的調(diào)用
這個接口我的理解:獲取 BeanDefinitionRegistry 對象,獲取到這個對象就可以獲取這個對象中注冊的所有 BeanDefinition 對象,所以我們知道了,我們擁有這個對象就可以完成里面所有 BeanDefinition 對象的修改新增操作
BeanPostProcessor 的注冊
Refresh().registerBeanPostProcessors 這個方法里面。
拿到 BeanFactory 中所有注冊的 BeanDefinition 對象的名稱 beanName。
然后判斷是否實現(xiàn)了 PriorityOrdered 排序接口,Ordered 排序接口,getBean 是將該 ppName 對應(yīng)的 BeanDefinition 對象實例化。
把對應(yīng)的 BeanPostProcessor 對象注冊到 BeanFactory 中,BeanFactory 中有一個list 容器接收。getSingleton 方法代碼位置:AbstractBeanFactory.doGetBean 方法中
方法里面核心要點:
把 beanName 添加到 singletonsCurrentlyInCreation Set 容器中,在這個集合里面的 bean 都是正在實例化的 bean,就是實例化還沒做完的 BeanName
調(diào)到 getObject 方法,完成 bean 的實例化。接下來
getObject 調(diào)用完后,就代表著 Bean 實例化已經(jīng)完成了,這時候就需要
1、singletonsCurrentlyInCreation 把 beanName 從這個集合中刪除
2、addSingleton,把 bean 緩存到一級緩存中
createBean
方法代碼位置:AbstractBeanFactory.doGetBean 方法中
這個方法是 bean 實例化核心方法
實例化方法,把 bean 實例化,并且包裝成 BeanWrapper點進(jìn)這個方法里面。
這個方法是反射調(diào)用類中的 factoryMethod 方法。這要知道@Bean 方法的原理,實際上spring 會掃描有@bean 注解的方法,然后把方法名稱設(shè)置到 BeanDefinition 的 factoryMethod屬性中,接下來就會調(diào)到上面截圖中的方法實現(xiàn)@Bean 方法的調(diào)用。該方法里面的參數(shù)解析過程不需要了解。
determineConstructorsFromBeanPostProcessors
這個方法是 BeanPostProcessor 接口類的首次應(yīng)用,最終會掉到AutowiredAnnotationBeanPostProcessor 類的方法,在方法中會掃描有注解的構(gòu)造函數(shù)然后完成裝配過程。
以上是Spring bean對象實例化的案例分析的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。