spring原始碼分析(二)配置檔案的解析

2021-09-20 01:37:35 字數 2746 閱讀 8081

最開始的入口,只是包了下resource

public int loadbeandefinitions(resource resource) throws beandefinitionstoreexception
1)儲存當前正在載入的資源

2)檢測是否有重複載入資源的情況

3)真正幹活的地方doloadbeandefinitions

public int loadbeandefinitions(encodedresource encodedresource) throws beandefinitionstoreexception 

//2、檢測是否有重複載入資源的情況

if (!currentresources.add(encodedresource))

inputstream inputstream = encodedresource.getresource().getinputstream();

try

//3、真正幹活的地方doloadbeandefinitions

return doloadbeandefinitions(inputsource, encodedresource.getresource());

}finally

//... 省略 一系列異常處理

}

1、這裡做的兩件事,將資源檔案解析成document

2、解析並註冊beandefinitions

protected int doloadbeandefinitions(inputsource inputsource, resource resource)

throws beandefinitionstoreexception

protected document doloaddocument(inputsource inputsource, resource resource) throws exception

document的解析

xmlbeandefinitionreader 將 document的生成,委託給了documentloader

看下預設實現 defaultdocumentloader

@override

public document loaddocument(inputsource inputsource, entityresolver entityresolver,

errorhandler errorhandler, int validationmode, boolean namespaceaware) throws exception

documentbuilder builder = createdocumentbuilder(factory, entityresolver, errorhandler);

return builder.parse(inputsource);

}

這裡使用了工廠方法模式

有了document之後,就可以很方便的通過document的api來讀取xml的元素。

具體的註冊呼叫過程,就不跟了,總之,最後會呼叫到org.springframework.beans.factory.xml.defaultbeandefinitiondocumentreader#parsebeandefinitions方法

protected void parsebeandefinitions(element root, beandefinitionparserdelegate delegate) 

else }}

}else

}private void parsedefaultelement(element ele, beandefinitionparserdelegate delegate)

else if (delegate.nodenameequals(ele, alias_element))

else if (delegate.nodenameequals(ele, bean_element))

else if (delegate.nodenameequals(ele, nested_beans_element))

}private void parsedefaultelement(element ele, beandefinitionparserdelegate delegate)

//alias標籤解析

else if (delegate.nodenameequals(ele, alias_element))

//bean標籤

else if (delegate.nodenameequals(ele, bean_element))

//beans標籤

else if (delegate.nodenameequals(ele, nested_beans_element))

}

Spring原始碼分析(二)

針對spring中bean初始化時擴充套件類執行順序進行分析 通過getbean逐層最終到bean例項化前後呼叫的方法,主要是aware介面 beanpostprocessor initializingbean init method的呼叫順序 abstractbeanfactory dogetbe...

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...