實現簡單spring ioc框架

2021-10-19 09:00:39 字數 4599 閱讀 7914

使用注入容器的時候新增value指定名字

使用@qualifier引入指定名字的物件

程式啟動的時候,將物件存入容器中

思路:com.hodor掃瞄路徑下的所有類:class檔案(到target目錄下掃瞄,掃瞄src目錄是沒用的,結果如com.hodor.service.orderservice),應該是遞迴掃瞄

根據class的路徑獲取類的全路徑com.hodor.service.impl.**等

獲取所有的class的全路徑,判斷迴圈的這個類是否有@controller或者@service等註解,如果類上有上述的註解,這個類需要反射建立物件,然後把物件存入ioc集合中(concurrenthashmap 執行緒安全)

遍歷全路徑的類,反射類中的屬性,使用反射檢測屬性上是否有@autowired註解,如果有就需要屬性的注入,匹配到零個或者多個都丟擲異常

對外提供乙個獲取ioc容器的api 如context.getbean(ordercontroller.class),過載多種方式獲取物件

總實現類

/**

* 2. 獲取需要掃瞄的包的檔案路徑

* 3. 裁取類的全路徑如 com.hodor.controller.ordercontroller

* 4. 反射建立類

* 5. 實現物件的依賴注入

* @param basepackage 傳入值為com.hodor

*/private

void

loadclasses

(string basepackage)

file file =

newfile

(replace_url, basepackage)

; system.out.

println

("file"

+ file)

;//3. 裁取類的全路徑如 com.hodor.controller.ordercontroller

findallclasses

(file)

;//4. 反射建立類

doinitinstance()

;//5. 實現物件的依賴注入

dodi()

; system.out.

println

("iocnamecontainer"

+ iocnamecontainer)

; system.out.

println

("ioccontainer"

+ ioccontainer)

; system.out.

println

("iocinte***ce"

+ iocinte***ce)

;}

宣告的幾個型別的容器方便getbean過載獲取物件
//傳入配置檔名

private string springconfig;

//存放所有的全類名

private list

classpathes =

newarraylist

<

>()

;//存放物件名和對應的例項,就是springioc容器,根據名字查詢

private map

iocnamecontainer =

newconcurrenthashmap

<

>()

;//ioc容器,以class檔案作為key

private map

?>

, object> ioccontainer =

newconcurrenthashmap

<

>()

;//springioc容器,物件實現的介面作為key,介面的是實現類作為value

private map

?>

, list

> iocinte***ce =

newconcurrenthashmap

<

>()

;

1. 解析掃瞄的包路徑

<?xml version="1.0" encoding="utf-8" ?>

>

base-package

="com.hodor"

/>

beans

>

public

class

springconfigpaser

catch

(documentexception e)

finally

catch

(ioexception e)}}

return basepackage;

}}

2和3. 遞迴掃瞄所有的類
/**

* 3. 裁取類的全路徑如 com.hodor.controller.ordercontroller

* 掃瞄檔案路徑下所有的class檔案,輸出檔案的全路徑,需要進行替換才能用於反射建立物件

* 將類的全路徑存入集合中

*/private

void

findallclasses

(file file)

else}}

//拿到檔案的路徑 e:\code\git\my-springioc\target\classes\com\hodor\service\impl\orderserviceimpl.class

//通過反射建立類 只需要com後面的路徑,類似於com.hodor.service.impl.orderserviceimpl

}

4. 反射建立類
/**

* 4. 反射建立類

* 判斷有註解的才需要例項化

* 需要考慮註解中有value的情況,就不能使用預設的類名作為物件名

*/private

void

doinitinstance()

else

// system.out.println("******name" + ******name);

//擴充套件可以使用三種不同的方式獲取物件

//通過物件名字獲取物件,重複的物件名就報錯

if(iocnamecontainer.

containskey

(******name)

) iocnamecontainer.

put(******name, instance)

;//通過class檔案過去物件

ioccontainer.

put(c, instance)

;//通過介面獲取物件

class<

?>

inte***ces = c.

getinte***ces()

;for

(class<

?> aninte***ce : inte***ces)

else}}

service serviceannotation = c.

getannotation

(service.

class);

if(serviceannotation != null)

else

// system.out.println("******name" + ******name);

if(iocnamecontainer.

containskey

(******name)

) iocnamecontainer.

put(******name, instance)

; ioccontainer.

put(c, instance)

; class<

?>

inte***ces = c.

getinte***ces()

;for

(class<

?> aninte***ce : inte***ces)

else}}

}}}catch

(exception e)

}

5. @autowired注入

可以擴充套件dao層,使用假資料測試,不宣告新註解使用自定義的@service或者@controller能實現

/**

* 5. 實現依賴注入

*/private

void

dodi()

}else}}

trycatch

(illegalacces***ception e)}}

}}}}

SpringIOC框架的簡單實現步驟

依賴注入 dependency injection 簡稱 di 與控制反轉 ioc 的含義相同程式設計客棧,只不過這兩個稱呼是從兩個角度描述的同乙個概念,具體如下 依賴注入可以有效的解耦合。有兩種實現的方法,一種是配置xml檔案來實現,另一種是通過引數實現,來,找個簡單的例子讓咱們上手試一試。int...

Spring IOC容器的簡單實現

inverse of control 控制反轉 將原本在程式中手動建立物件的控制權,交由spring框架來管理 若要使用某個物件,只需要從 spring 容器中獲取需要使用的物件,不關心物件的建立過程,也就是把建立物件的控制權反轉給了spring框架。github只有src下的檔案和pom.xml檔...

Spring IOC技術簡單實現(二)

在這裡我們先思考乙個場景,有bean註解且含有引數的方法該如何處理?這裡有乙個關鍵的點是 方法所依賴的引數是否滿足。如果滿足,則該方法是可以執行並且得到乙個bean的,如果多個方法的引數形成了迴圈依賴關係,則應將這種迴圈依賴告知使用者。下面我們先介紹乙個小例子方便大家理解什麼是迴圈依賴 an hig...