-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
关于扩展点SPI方案的重构 #1092
Comments
挺好的建议,但是这样改造后我们在非spring环境下就无法使用spi了,spi作为一个基础组件就和spring绑定了 |
我尝试理解一下你的思路,目前是 SPI 机制存在两个问题:
而这个 issues 的核心应该旨是在于优化这两个痛点:
不知我这么理解对吗? |
@weihubeats 是的,不过我理解hippo4j本身不可能脱离spring。这种模式是对于传统spi方式的一种spring增强,两种模式可以共存 |
@Createsequence 是的,可以这么理解。不过第二点中更准确点是获取了我们希望的扩展点执行结果。至于由哪个实现类提供取决于我们对于结果的预期(比如 第一个非空结果)。 |
@magestacks 可以指派给我, 我来试下 |
Very welcome |
需求建议
重构扩展点(SPI)功能
现有的扩展点的注册和使用都是通过ServiceLoader实现.
(cn.hippo4j.common.spi.DynamicThreadPoolServiceLoader)
有什么问题:
怎么解决:
注册的问题 - 结合spring
在Spring启动时, 扫描容器中所有被打上
@Realization
(表示扩展点的实现类) 注解的 Bean, 并注册到ExtensionRegistry当中, 是一个 Map<Class<?>, List> extensionMap (扩展点接口类 <-> 扩展点实现list) 的注册表.使用时, 通过调用的扩展点接口类, 在注册表当中找到对应的实现类对象List.
结果处理的问题 - 引入结果规约处理器Reducer
Reducer本质上是一个DataCollector, 通过统一的ExtensionInvoker触发器, 传入扩展点接口class, callback行为, 和一个Reducer.
触发代码可能如下: (比如场景是想找到第一个结果为非空的MyObject对象)
函数原型:
这样我们就可以通过一行代码干净的解决扩展注册/寻找和结果处理的问题
规约函数, 可能出现如下几种类型:
The text was updated successfully, but these errors were encountered: