使用注入容器的時候新增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...