Hasor 用代码配置注入

2018-10-06 10:30 更新

前面我们讲了很多依赖注入的功能都是基于注解实现,现在我们回归原始在这一小节,专门讲解如何通过代码形式完成依赖注入的配置。

在开始之前我们先把场景列出来。现在我们有一个 “OrderManager” 类,它在初始化时会根据一些业务逻辑来决定注入的细节。例如:具体使用哪一套库存系统。

这个时候前面讲到的各种依赖注入方式,可能都因为没有太多的灵活性而导致无法完成场景需要。这个时候你可以通过 Hasor 的 InjectMembers 接口完成更加灵活的对象依赖注入控制。


具体请看代码:

public class OrderManager implements InjectMembers {
    @Inject  // <-因为实现了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 中进行预先配置。

public class OrderManager {
    public StockManager stockBean;
    ...
}


实现注入的 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);
    }
}



以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号