Skip to main content

ApiBinder

tip

ApiBinder 扩展机制是从 Hasor 2.3 之后加入的。这个扩展机制可以帮助应用或工具框架在 init 阶段构建自己的交互接口。

它存在最大的意义在于可以统一开发体验,即基于 ApiBinder 的扩展的程序,其加载和初始化方式可以融合在 Module 之中。

这种能力使得扩展工具即便是第三方工具,使用者在使用的时候感受犹如 Hasor 原生一般。

原理

在 Hasor init 过程的 newApiBinder 阶段,Hasor 会从配置文件中收集所有 ApiBinder 扩展点并创建它们。

被创建的扩展点对象会存放在一个叫 supportMap 的 Map 对象中,Map 的 key 是用户自定义的 ApiBinder 接口。

最后这些扩展点类型会通过 Java 的动态代理机制归纳到一个代理对象身上,然后每次方法调用会自动路由到对应的 Api 提供者中。

例子

在下面例子中这个类型是 net.test.binder.TestBinder。首先在 Hasor 的配置文件中注册一个 ApiBinder 扩展。其中 TestBinderCreator 类实现了 net.hasor.core.binder.ApiBinderCreator 接口。

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://www.hasor.net/sechma/main">
<hasor.apiBinderSet>
<!-- 注册扩展 -->
<binder type="net.test.binder.TestBinder">net.test.binder.TestBinderCreator</binder>
</hasor.apiBinderSet>
</config>

TestBinderCreator 实现如下:

public interface TestBinder extends ApiBinder {
public void hello();
}

public class TestBinderImpl extends ApiBinderWrap implements TestBinder {
public TestBinderImpl(ApiBinder apiBinder) {
super(apiBinder);
}

public void hello() {
System.out.println("Hello Binder");
}
}

public class TestBinderCreator implements ApiBinderCreator {
public TestBinder createBinder(ApiBinder apiBinder) {
return new TestBinderImpl(apiBinder);
}
}

最后启动 Hasor 并加载配置文件来使用这个扩展:

Hasor.create().mainSettingWith("my-hconfig.xml").build(apiBinder -> {
TestBinder myBinder = apiBinder.tryCast(TestBinder.class);
myBinder.hello();
});

当程序运行到 myBinder.hello() 之后,控制台就会打印出 "Hello Binder"

关于tryCast

tryCast 会做尝试转换,如果 apiBinder 并未加载 TestBinder 扩展,tryCast 会返回 null。因此 tryCast 函数的功效等同于:

if (apiBinder instanceof TestBinder) {
return (TestBinder)apiBinder;
} else {
return null;
}