dremio 对于服务的依赖管理以及处理没有直接使用google guice,而是dremio 自己包装了一个类似guice的ioc 能力
提供的能力说明
因为对于ioc 来说需要包含不同的几种服务注入模式(属性注入,构造函数注入),服务也会包含不同的scope (单例,实例,provider模式)
同时为了处理不同注入注解的处理,dremio 也包装了自己的处理,相比直接使用guice dremio 也包装了不少其他的能力(remove,replace )
SingletonRegistry参考类图
SingletonRegistry 是对于服务的直接使用(ioc 以及对于ioc 的扩展能力),下图是提供的能力以及继承关系
说明
dremio 对于ioc 的处理核心是为了服务dremio 自己的service 机制,相对传统的ioc 机制扩展了不少,简单了解dremio 的ioc 机制有助于更好的学习dremio 源码
当然dremio 也是可以支持将guice 的ioc 能力集成到系统中的,主要是Binder 中的,接口定义如下,目前官方代码中并没有直接传递Injector的,主要是在测试代码
中使用到了,所以dremio 部分源码我们看起来比较杂乱,不像trino 代码很清晰(遵循了guice 的实践玩法)
public interface Binder extends BindingCreator, BindingProvider {
public interface Binder extends BindingCreator, BindingProvider {
/**
* Temporary way to register a Guice Injector with Binder as a fallback mechanism
*
* @param injector the Guice instance to use as an fallback
*/
void registerGuiceInjector(Injector injector);
}
参考资料
common/src/main/java/com/dremio/service/BinderImpl.java
common/src/main/java/com/dremio/service/Binder.java
common/src/main/java/com/dremio/service/SingletonRegistry.java
sabot/kernel/src/test/java/com/dremio/exec/server/SabotNode.java