W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
前面我們講了很多依賴注入的功能都是基于注解實現(xiàn),現(xiàn)在我們回歸原始在這一小節(jié),專門講解如何通過代碼形式完成依賴注入的配置。
在開始之前我們先把場景列出來?,F(xiàn)在我們有一個 “OrderManager” 類,它在初始化時會根據(jù)一些業(yè)務(wù)邏輯來決定注入的細節(jié)。例如:具體使用哪一套庫存系統(tǒng)。
這個時候前面講到的各種依賴注入方式,可能都因為沒有太多的靈活性而導(dǎo)致無法完成場景需要。這個時候你可以通過 Hasor 的 InjectMembers
接口完成更加靈活的對象依賴注入控制。
具體請看代碼:
public class OrderManager implements InjectMembers {
@Inject // <-因為實現(xiàn)了InjectMembers接口,因此@Inject注解將會失效。
public StockManager stockBeanTest;
public StockManager stockBean;
//
public void doInject(AppContext appContext) throws Throwable {
boolean useCaseA = ...
if (useCaseA){
this.iocBean = appContext.findBindingBean(
"caseA",PojoBean.class);
}else{
this.iocBean = appContext.findBindingBean(
"caseB",PojoBean.class);
}
//
}
}
您要注意的是,為了避免 InjectMembers 接口注入和注解注入同時生效造成的混亂。一旦您打算使用 InjectMembers 方式進行注入 Hasor 就不會在解析注解進行注入。
接下來我們在介紹一種代碼形式的依賴注入,還是以上面的例子為樣本。我們可以在 Module 中進行預(yù)先配置。
public class OrderManager {
public StockManager stockBean;
...
}
實現(xiàn)注入的 Module 這樣編寫:
public class MyModule implements Module {
public void loadModule(ApiBinder apiBinder) throws Throwable {
...
boolean useCaseA = ...;
BindInfo<StockManager> injectTo = null;
if (useCaseA){
injectTo = apiBinder.bindType(StockManager.class)
.to(StockManagerCaseA.class).toInfo();
}else{
injectTo = apiBinder.bindType(StockManager.class)
.to(StockManagerCaseB.class).toInfo();
}
apiBinder.bindType(OrderManager.class).inject("stockBean",injectTo);
}
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: