Date 10.06 pmhtml
拿到全部的bean定義信息(在 beanDefinitionNames
中,遍歷listjava
獲取到bean的定義信息git
若是這個bean不是抽象,是單例,不是懶加載的github
判斷這個bean是否factorybean(判斷這個bean有沒有實現factoryBean接口),是的話,用工廠裏面的方法去建立bean。緩存
getbean(&beanname)
獲取到beanFactory對象。調用getBean(beanName)
建立bean多線程
調用 doGetBean()
mvc
transformedBeanName
進入這個方法將以前工廠bean的前綴去除,將別名轉成正式的名稱app
getSingleton
檢測單例緩存中是否有已構建的單實例bean,有就直接返回這個單例beanide
/** Cache of singleton objects: bean name to bean instance. */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256); ``` 全部實例過的單例bean都會在這注冊,檢查的時候還會判斷當前bean有沒有在建立過程當中。若是有的話,會在earlySingletonObjects
去獲取,要是這個仍是沒有獲取到的話,會去singletonFactories
這個map中去獲取,要是獲取到的話就刪除singletonFactories
中的bean,轉而在earlySingletonObjects
這個map裏面去註冊post
Collections.newSetFromMap(new ConcurrentHashMap<>(256))
裏面,防止多線程的時候屢次建立單例beancreateBean
,開始單例bean建立
methodOverrides
這個屬性有沒有值)resolveBeforeInstantiation()
beforeInstantiationResolved
判斷初始化以前有沒有處理,有的話就不進入這個processor中了,InstantiationAwareBeanPostProcessor
這個processor了,而後去獲取這個bean的目標class,而後調用InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation
啓動前置處理器,而後若是返回的bean有值的話,再調用applyBeanPostProcessorsAfterInitialization
後置處理器,而後將bean定義信息中beforeInstantiationResolved
這個參數賦值成這個返回的bean,而後返回這個bean原文出處:https://www.cnblogs.com/wzqshb/p/11774767.html