這篇文章將為大家詳細講解有關spring注入對象的方法和創建bean的步驟,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:主機域名、虛擬空間、營銷軟件、網站建設、鐵力網站維護、網站推廣。首先需要知道一個大致實現
● 這個注入過程肯定是在 BeanPostProcessor 中實現的
●spring 是在 beanFactory.getBean 進行 bean 實例化的,即懶加載
● 根據第二條,也就是說在 getBean 的時候才會去調用所有 BeanPostProcessor
● 第二篇文章說到,BeanFactory 的 refresh 過程只是注冊 BeanPostProcessor,真正執行在 getBean 方法中
MergedBeanDefinitionPostProcessor 也是一種 BeanPostProcessor 它重新弄了個一個生命周期函數,替代了 BeanPostProcessor 默認的生命周期函數,這么看吧,我貼一小段源碼
for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof MergedBeanDefinitionPostProcessor) { MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp; bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName); } }
它允許你在非 BeanFactoryProcess 中去修改 Bean 定義
InstantiationAwareBeanPostProcessor 也是一種 BeanPostProcessor 它也重新定義了一個生命周期函數,它允許把屬性值注入到屬性對象中
@Autowired 加載定義的過程
我們先不看 bean 的創建過程,就看 MergedBeanDefinitionPostProcessor 的實現子類,這里看名字猜測
AutowiredAnnotationBeanPostProcessor 應該就是干這件事的,所以我們接下來可以直接看
AutowiredAnnotationBeanPostProcessor 的 postProcessMergedBeanDefinition 方法的代碼。
順著方法的調用,可以知道在 buildAutowiringMetadata 是真正查找這些注解的地方,最后 checkConfigMembers 將 Member 注冊進了 bean 定義,具體如何查找的讀者自行查看源碼。
這里只是將 Member 注冊進了 bean 定義,真正實例化在填充 Bean 的過程中,下面說到 bean 的創建過程可以知道是何時注入的。
Bean 的創建過程
前面說到 spring 是在 getBean 的過程中進行 Bean 創建的,創建 bean 分為幾個步驟
1. 獲取 bean 定義
2. new Bean()
3. 執行生命周期函數 (前)
4. 創建依賴項
5. 填充 bean
6. 執行生命周期函數(后)
入口為 BeanFactory.getBean ,BeanFactory 的實現類為 DefaultListableBeanFactory 這些你可以在 BeanFactory 的 refresh 過程中找到
根據源碼,如果 bean 還不存在時,就會執行 bean 的創建流程
獲取 bean 定義在這段源碼中
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
緊跟著,根據 Bean 定義搜索其依賴項,并創建 bean ,可以看出是遞歸創建 bean
String[] dependsOn = mbd.getDependsOn(); for (String dep : dependsOn) { getBean(dep); }
然后就創建 bean 了
if (mbd.isSingleton()) { createBean(beanName, mbd, args); } // 真正的執行在 doCreateBean 過程中 Object beanInstance = doCreateBean(beanName, mbdToUse, args);
創建 bean 第一步 new Bean
if (instanceWrapper == null) { instanceWrapper = createBeanInstance(beanName, mbd, args); }
創建 bean 第二步,執行所有的 processor ,包含 MergedBeanDefinitionPostProcessor ,所以在這一步注冊注入選項
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
創建 bean 第三步,填充 bean ,這里做的 @Autowired 注入
populateBean(beanName, mbd, instanceWrapper);
最終的處理過程在 AutowiredAnnotationBeanPostProcessor 的 postProcessPropertyValues 函數中
metadata.inject(bean, beanName, pvs);
因為在前面已經獲取過依賴項,并且把其丟進了容器,所以這里是直接用反射寫進去就可以了
創建 bean 第四步,初始化 bean ,這里有一個方法注入,方法注入原來發生在初始化 bean 過程中,還有就是生命周期函數執行了,包含 BeanPostProcessor 的前置后置生命周期,初始化方法等
小說明 :AutowiredAnnotationBeanPostProcessor 即是 一個 MergedBeanDefinitionPostProcessor 也是一個 InstantiationAwareBeanPostProcessor
關于spring注入對象的方法和創建bean的步驟就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
當前題目:spring注入對象的方法和創建bean的步驟-創新互聯
當前路徑:http://vcdvsql.cn/article0/csigio.html
成都網站建設公司_創新互聯,為您提供手機網站建設、關鍵詞優化、外貿網站建設、域名注冊、網站內鏈、虛擬主機
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯