Spring 原始碼筆記

2021-09-26 02:29:40 字數 4487 閱讀 1600

​ 1.1 載入配置檔案 doloadconfig(config.getinitparameter(「contextconfiglocation」))

​ 如果是載入properties相對簡單一點,xml要解析,複雜一點

properties properties =

newproperties()

;inputstream is =

this

.getclass()

.getclassloader()

.getresourceasstream

(string location)

;properties.

load

(is)

;//此時,配置檔案已經載入到properties中

​ 1.2 根據配置檔案掃瞄所有的相關類 doscanner(p.getproperty(「scanpackage」));

list classnames =

newarraylist

<

>()

;//進行遞迴掃瞄

url url =

this

.getclass()

.getclassloader()

.getresource

("/"

+packagename.

replaceall

("\\."

,"/"))

;file classdir =

newfile

(url.

getfile()

);for(file file : classdir.

listfiles()

)else

}

​ 1.3 初始化相關類的例項,並將其放入ioc容器中,也就是map中 doinstance()

private map

ioc =

newhashmap

();//ioc容器

if(classnames.

isempty()

)for

(string classname : classnames)

/***初始化ioc容器 新增註解的才例項化

*ioc容器規則

*1.key預設用類名首字母小寫

*2.如果使用者自定義,優先選擇使用者自定義名字

*3.如果是介面的話,我們可以巧妙用介面型別作為key

*/if

(clazz.

isannotationpresent

(controller.

class))

else

if(clazz.

isannotationpresent

(service.

class))

object instance = clazz.

newinstance()

; ioc.

put(beanname,instance)

;//3.如果是介面的話,我們可以巧妙用介面型別作為key

class<

?>

inte***ces = clazz.

getinte***ces()

;for

(class<

?> i : inte***ces)

}else

​ 1.4 實現自動依賴注入 doautowired()

if

(ioc.

isempty()

)for

(map.entry

entry : ioc.

entryset()

);autowried autowried = field.

getannotation

(autowried.

class);

string beanname = autowried.

value()

.trim()

;if(""

.equals

(beanname)

)//想訪問私有的,受保護的 要強制授權訪問

field.

setaccessible

(true);

//疑問:object instance = entry.getvalue(); field為什麼set兩個物件例項?

//其實是給物件屬性賦值,第乙個引數相當於new出來乙個物件,第二個引數是具體值。

field.

set(entry.

getvalue()

,ioc.

get(beanname));

}}

//改造版:

private list

newarraylist

();handler中含有method,

pattern

(正則)

,paramorder,controller

if(ioc.

isempty()

)for

(map.entry

entry : ioc.

entryset()

) string baseurl ="";

if(clazz.

isannotationpresent

(controller.

class))

method[

] method = clazz.

getmethod()

;for

(method method : methods)

getannotation

class);

/* //多輸入的/替換為乙個

*/string regex =

("/"

value()

).replaceall

("/+",""

);pattern pattern = pattern.

compile

(regex)

;add

(new

handler

(pattern,entry.

getvallue()

,method));

logger.

info

(,regex,method);}

}1.6 dopost()

//執行階段所執行的方法

/*string url = req.getrequesturi();

string contextpath = req.getcontextpath();

url = url.replace(contextpath,"").replaceall("/+","");

resp.getwriter().writer("404 not found!");}*/

//改造後:

handler handler =

gethandler

(req);if

(handler == null)

//獲取方法引數列表

class<

?>

paramtypes = handler.method.

getparametertypes()

;//儲存所有需要自動賦值的引數值

object[

] paramvalues =

newobject

[paramtypes.length]

;map]> params = req.

getparametermap()

;for

(map.entry]> param : params.

entryset()

)get

(param.

getkey()

);paramvalues[index]

=convert

(paramtypes[index]

, value);}

//設定方法中的request 和 response物件

spring原始碼筆記

beanfactory是頂層介面,最終實現類是defaultlistablebeanfactory,beanfactory有三個重要的子類,listablebeanfactory,hierarchicalbeanfactory autowirecapablebeanfactory 其中listabl...

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...

Spring原始碼學習筆記

最近在看spring的原始碼,擔心忘掉了,打個記號,也請大家一起指正其中的錯誤,防止走歪路。從xml 配置檔案載入入手 xml配置檔案載入由 完成,該類的繼承關係如下 實際呼叫 personservice service personservice context.getbean personser...