個人理解,可能有錯誤
推斷構造方法 :
呼叫後置處理器 determineconstructorsfrombeanpostprocessors 第一次推斷構造方法,分幾種情況:
手動注入:
1.如果沒有提供構造方法-------推斷構造為null,例項化物件預設使用無參構造
2.如果提供了預設的無參構造方法-------推斷構造為null,例項化物件預設使用無參構造
3.如果提供了多個構造方法-------推斷構造為null,例項化物件預設使用無參構造
4.如果提供了多個構造方法,其中乙個加了@autowried(required=true)------推斷構造就返回這個構造,用這個構造方法例項化物件
5.如果提供了多個構造方法,加了多個@autowried(required=true)------異常,報錯
6.如果提供了多個構造方法,加了多個@autowried(required=false)------推斷返回多個,加了這個註解的和預設的構造方法都返回------然後進行再次推斷autowireconstructor(beanname, mbd, ctors, args),
7.如果提供乙個帶參構造方法,同時不提供無參構造------推斷返回這個構造方法
8.如果提供多個帶參構造方法,同時不提供無參構造------推斷返回null,準備使用預設構造例項化物件,此時無法獲得預設無參構造,所以報錯。
自動注入:
使用bean工廠後置處理器beanfactorypostprocessor 修改目標類的注入模型為自動注入autowire_constructor,就必然會進入再次推斷方法中
1.第一次推斷返回空------進入再次推斷autowireconstructor,先獲取所有構造,再進行後面的操作
2.第一次推斷返回多個構造方法------將第一次返回的構造方法傳給autowireconstructor(beanname, mbd, ctors, args),進入再次推斷,獲取ctors,在進行後面的操作
再次推斷構造方法 autowireconstructor(beanname, mbd, ctors, args):
如果ctors為空,就重新獲取所有構造;如果不為空,就使用ctors。
然後對構造方法進行排序,引數越多的構造越靠前,然後遍歷取有效的那個,結果就是取到有效構造中引數最多的那個構造;引數數量相同的,引數是類的比是介面的優先;引數數量相同且是最多的,並且引數型別也是形同的,會把兩個構造方法都放到模糊不清的構造方法set中,返回的是排序時在前面的那個。
推斷完構造方法以後,都會放到快取中【argsholdertouse.storecache(mbd, constructortouse)】,不管是單例的還是原型的
spring原始碼分析 spring原始碼分析
1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...
Spring 原始碼分析
public throws bean ception 到這裡最終的方法就是refresh super只是做一些初始化工作,可以忽略。以下是初始化發放做的事情 debug main adding systemproperties propertysource with lowest search pr...
spring原始碼分析
spring源 解析 一 ioc容器 url spring源 解析 二 ioc容器在web容器中的啟動 url spring源 解析 三 spring jdbc url spring源 解析 四 spring mvc url spring源 解析 五 spring aop獲取proxy url sp...