Spring原始碼之 容器的載體和容器的載入

2021-10-25 17:14:37 字數 3007 閱讀 7347

測試用例

使用如下的列舉建立單例容器 .

@slf4j

// 建立私有的無參建構函式

@noargsconstructor

(access = accesslevel.private)

public

class

beancontainer

private

enum containerholder

}}

容器的組成部分:

儲存class 物件以及例項的載體 .

容器的載入

對外提供容器的操作方式, 便於 客戶端操作載體中的物件.

使用concurrenthashmap來儲存目標型別的物件和例項. concurrenthashmap併發性強, jdk8摒棄了之前的分段鎖, 採用cas, 紅黑樹, 提公升細節.

實現容器的載入

實現思路.

配置的管理與獲取

獲取指定範圍內的class物件

依據配置提取class物件, 連同例項一併存入容器中.

**如下

@slf4j

// 建立私有的無參建構函式

@noargsconstructor

(access = accesslevel.private)

public

class

beancontainer

/** * 1. 配置的管理與獲取

* 載入bean的註冊列表.

* 把用component, controller, service, repository 註解標記的類載入到記憶體中去

*/private

static

final list

?extends

annotation

>> bean_annotation =

arrays.

aslist

(component.

class

, controller.

class

, service.

class

, repository.

class);

/** * 返回容器中bean的數量

* @return

*/public

intsize()

/** * 獲取單例的bean容器例項

** @return

*/public

static beancontainer getinstance()

private

enum containerholder

}/**

* 掃瞄載入所有的bean

* 3. 依據配置提取class物件, 連同例項一併存入容器中.

** 加上synchronized 防止兩個執行緒去載入容器

*/public

synchronized

void

loadbeans

(string packagename)

// 通過傳入的包名, 把類載入到集合中

set?>> classset = classutil.

extractpackageclass

(packagename);if

(validationutil.

isempty

(classset)

)// 遍歷所有載入到的類例項

for(class<

?> clazz : classset)}}

loaded =

true;}

}

其核心為loadbeans方法載入bean到容器中. 有如下的注意點和步驟

方法用synchronized修飾, 避免多執行緒的情況下, 兩個執行緒同時去載入bean

loaded布林值來標記是否已經載入過bean, 只需載入一次bean到容器中

通過classutil.extractpackageclass(packagename)工具類根據傳入的包路徑,把類加入到集合中

遍歷所有的類的集合, 根據 isannotationpresent 來判斷是否為所需要的component, controller, service, repository註解 修飾的類

如果是被指定註解修飾的類, 那麼將其放入beanmap中.

呼叫classutil.newinstance(clazz, true)方法去建立類的例項

newinstance 工具類方法如下

/**

* @param clazz class 類物件

* @param accessible 是否支援建立出私有class物件例項

* @param class的型別

* @return 例項化的類

*/public

static

t newinstance

(class<

?> clazz,

boolean accessible)

catch

(exception e)

}

編寫beancontainertest測試類

@beforeall 註解用於所有的測試用例執行之前 , 執行僅且一次初始化.

需要先例項化容器例項.

public

class

beancontainertest

@displayname

("載入目標類及例項到beancontainer"

)@test

public

void

loadbeanstest()

}

測試結果如下, 測試通過.

Spring原始碼 核心 容器

核心思想 容器 web容器 tomcat等 啟動載入web.xml配置檔案,將配置資訊封裝成servletcontext spring配置 contextconfiglocation param name classpath spring dal.xml classpath spring servi...

Spring原始碼學習之容器的功能擴充套件

我們都站在巨人的肩膀上 宣告 參考 spring原始碼深度解析 beanfactory bf new xmlbeanfactory new classpathresource beanfactorytest.xml 2.設定配置路徑public void setconfiglocations str...

Spring原始碼解析之IoC容器主要介面設計

ioc的主要介面設計圖如下面所示 下面分析一下這張圖 從圖中我們可以得到,從介面beanfactory hierarehicalbeanfactory介面 configurablebeanfactory介面,是一條主要的beanfactory設計路線。在這條介面設計路線中,beanfactory介面...