ClouGence / hasor

Hasor是一套基于 Java 语言的开发框架,区别于其它框架的是 Hasor 有着自己一套完整的体系,同时还可以和先有技术体系做到完美融合。它包含:IoC/Aop容器框架、Web框架、Jdbc框架、RSF分布式RPC框架、DataQL引擎,等几块。
http://www.hasor.net
Apache License 2.0
983 stars 273 forks source link

依赖注入问题 #24

Closed uuxii closed 4 years ago

uuxii commented 4 years ago

类如果实现了UdfSourceAssembly,那么@autowire注解注入的属性就是null了,不知是否正常

zycgit commented 4 years ago

原因是:Dataway 是依托 Hasor 生态构建的,因此使用的是 Hasor 内置的 IoC 容器。@autowire 注解是 Spring 生态的东西,两者并不相通。

解决办法是

使用 QueryModule, SpringModule 组合

public class MyModule implements QueryModule, SpringModule {
    public void loadModule(QueryApiBinder apiBinder) throws Throwable {
         ...
    }
}

在加载 UdfSource 的时候利用 QueryApiBinder#loadUdfSource 的重载方法将 Bean 的创建委托给 Spring

方法一:

apiBinder.loadUdfSource(
        apiBinder.findClass(DimUdfSource.class),// 找到标了 @DimUdfSource 注解的 UdfSource
        aClass -> true,            // 第一个参数中所有类型都被允许加载
        springTypeSupplier(apiBinder)  // 利用 TypeSupplier 可以将 Bean 的创建委托给 Spring
);

方法二:

apiBinder.loadUdfSource(
        MyUdf.class,                    // UdfSource类型
        springTypeSupplier(apiBinder)   // 创建 MyUdf 委托给 Spring
);

springTypeSupplier 方法是 SpringModule 接口提供的。

这样就把 Bean 的创建工作全权委托给了 Spring,你的 Autowire 注解就不在话下了。

剩下的你需要做的就是 在 Spring 中声明 MyUdf.class 比如加一个 @Component 注解。