ApiBinder 扩展机制存在的意义在于,可以帮助应用或工具框架在 init 阶段构建自己的交互接口。

提示

ApiBinder 扩展机制是从 Hasor 2.3 之后加入的。

原理

在 Hasor init 过程的 newApiBinder 阶段,Hasor 会从配置文件中收集所有 ApiBinder 扩展点并创建它们。../_images/CC2_E1VA_864B_GCI5.png被创建的扩展点对象会存放在一个叫 supportMap 的 Map 中,Map 的 key 是用户自定义的 ApiBinder 接口。在下面例子中这个类型是 net.test.binder.TestBinder

最后这些扩展点类型会通过 Java 的动态代理机制归纳到一个对象身上,完整的处理逻辑在 net.hasor.core.context.TemplateAppContext 类中。

演示样例

首先在 Hasor 的配置文件中注册一个 ApiBinder 扩展。其中 TestBinderCreater 类实现了 net.hasor.core.binder.ApiBinderCreater 接口。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <config xmlns="http://helloword.youhosts.com/sechma/main">
  3. <hasor.apiBinderSet>
  4. <!-- 注册扩展 -->
  5. <binder type="net.test.binder.TestBinder">net.test.binder.TestBinderCreater</binder>
  6. </hasor.apiBinderSet>
  7. </config>

其中地址 http://helloword.youhosts.com/sechma/main 是一个虚拟存在的地址,这个地址被用作 Xml 命名空间。

TestBinderCreater 实现如下:

  1. public interface TestBinder extends ApiBinder {
  2. public void hello();
  3. }
  4. public class TestBinderImpl extends ApiBinderWrap implements TestBinder {
  5. public TestBinderImpl(ApiBinder apiBinder) {
  6. super(apiBinder);
  7. }
  8. public void hello() {
  9. System.out.println("Hello Binder");
  10. }
  11. }
  12. public class TestBinderCreater implements ApiBinderCreater {
  13. public TestBinder createBinder(ApiBinder apiBinder) {
  14. return new TestBinderImpl(apiBinder);
  15. }
  16. }

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

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

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

关于tryCast

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

  1. if (apiBinder instanceof TestBinder) {
  2. return (TestBinder)apiBinder;
  3. } else {
  4. return null;
  5. }