AbstractApplicationContext#finishBeanFactoryInitialization
beanFactory.preInstantiateSingletons()
-> AbstractBeanFactory#getBean 開始獲取Bean流程:
- DefaultSingletonBeanRegistry#getSingleton 從快取中獲取Bean實體
- 從3級快取(singletonObjects)中獲取,存在直接回傳
- 不存在,從二級快取(earlySingletonObjects)中獲取, 存在直接回傳
- 不存在,從一級快取(singletonFactories)中獲取, 存在則生產Bean,此時如果是代理物件,則生成對應的代理物件,保存到二級快取中
- DefaultSingletonBeanRegistry#getSingleton 這個方法的入參就是beanName和factory的lambda運算式,
- DefaultSingletonBeanRegistry#getSingleton獲取最終的Bean方法,從3級快取(singletonObjects)拿,拿不到開始創建,
singletonObject = singletonFactory.getObject();執行傳入的singletonFactory方法createBean(beanName, mbd, args);createBean方法也是封裝了下面的方法Object beanInstance = doCreateBean(beanName, mbdToUse, args);- AbstractAutowireCapableBeanFactory#createBeanInstance 新建簡單bean(此時未設定屬性)此時放入1級快取 放的是factory物件(需要的話生產代理物件,也可以是普通Bean物件)
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean)); - AbstractAutowireCapableBeanFactory#populateBean 屬性填充:
- AbstractBeanFactory#getBeanPostProcessors 獲取bean所有后置處理器,遍歷呼叫postProcessProperties方法,其中AutowiredAnnotationBeanPostProcessor#postProcessProperties 這個后置處理器進行依賴注入
- InjectionMetadata#inject 拿到所有的屬性,遍歷
- AutowiredFieldElement#inject 注入單個屬性
- DefaultListableBeanFactory#resolveDependency 準備處理依賴,按不同型別呼叫不同的方法,其實走的是else流程,if里都是特殊的型別,
- DefaultListableBeanFactory#doResolveDependency 拿到需要被注入的Bean的Candidates,這里的autowired首先按型別查詢,當存在多個同型別的Candidate時,按名稱查詢,
- DependencyDescriptor#resolveCandidate 處理拿到的這個candidate,獲取Bean
- AbstractBeanFactory#getBean-> AbstractAutowireCapableBeanFactory#doCreateBean 從頭開始相同操作,
- DependencyDescriptor#resolveCandidate 處理拿到的這個candidate,獲取Bean
- DefaultListableBeanFactory#doResolveDependency 拿到需要被注入的Bean的Candidates,這里的autowired首先按型別查詢,當存在多個同型別的Candidate時,按名稱查詢,
- DefaultListableBeanFactory#resolveDependency 準備處理依賴,按不同型別呼叫不同的方法,其實走的是else流程,if里都是特殊的型別,
- AutowiredFieldElement#inject 注入單個屬性
- InjectionMetadata#inject 拿到所有的屬性,遍歷
- AbstractBeanFactory#getBeanPostProcessors 獲取bean所有后置處理器,遍歷呼叫postProcessProperties方法,其中AutowiredAnnotationBeanPostProcessor#postProcessProperties 這個后置處理器進行依賴注入
- 此時執行Bean的后置處理器
- AbstractBeanFactory#registerDisposableBeanIfNecessary ???好像是設定可銷毀的Bean
- AbstractAutowireCapableBeanFactory#createBeanInstance 新建簡單bean(此時未設定屬性)此時放入1級快取 放的是factory物件(需要的話生產代理物件,也可以是普通Bean物件)
- DefaultSingletonBeanRegistry#addSingleton 新創建的Bean需要將Bean放入一級快取,并移除二級快取和三級快取,
- AbstractAutowireCapableBeanFactory#getObjectForBeanInstance 如果剛剛創建的是FactoryBean實體,則從Bean工廠中生產Bean實體物件,普通的Bean物件不做處理,還是剛付訓取or創建的Bean,
- DefaultSingletonBeanRegistry#getSingleton獲取最終的Bean方法,從3級快取(singletonObjects)拿,拿不到開始創建,
-> 加載完所有的Bean之后 執行Bean初始化回呼
- 如果Bean實作了SmartInitializingSingleton介面,執行它的實作方法afterSingletonsInstantiated
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/177536.html
標籤:Java
