一、SPI 机制 ​

(一)Pamirs SPI 框架 ​

整合三种服务发现机制,支持组件动态扩展:

  • 注解规则:
    • 接口通过@SPI指定默认扩展名(默认为 "pamirs")和加载工厂
    • 实现类通过@SPI.Service设置扩展名(Spring SPI 默认 Bean 名称,Java SPI 为全类名)
    • @Order/@Priority定义扩展优先级

(二)配置方式 ​

1、Java SPI ​

  • 接口:public interface DemoApi { List<String> demo(); }
  • 实现类:@Order(10) public class DemoApiImpl implements DemoApi { ... }
  • 配置文件:META-INF/services/接口全类名 写入实现类全路径

2、Annotation SPI ​

  • 接口:@SPI("ext1") public interface DemoApi { ... }
  • 实现类:@SPI.Service("ext1") @Order(10) public class DemoApiImpl implements DemoApi { ... }

3、Spring SPI ​

  • 实现类:@Component("ext1") @Order(10) public class DemoApiImpl implements DemoApi { ... }

4、调用方式 ​

java
// 指定扩展名调用
DemoApi ext = ExtensionServiceLoader.getExtension(DemoApi.class, "ext1");

// 按优先级获取列表
List<DemoApi> spis = ExtensionServiceLoader.getExtensionLoader(DemoApi.class).getOrderedExtensions();

// 快捷方式(Spider工具类)
DemoApi ext = Spider.getExtension(DemoApi.class, "ext1");

二、系统扩展点 ​

(一)框架层 ​

扩展点实现位置SPI接口
Spring类型转换器*否SpringTypeConverterRegister
#register
SPI加载器工厂*是ServiceLoaderFactory
SPI路径设置*是SpiClassPathApi

(二)元数据扫描 ​

扩展点实现位置SPI接口
元数据注解转换器*否ModelConverter
元数据模型签名器*否ModelSigner
元数据注解转换器白名单yaml:pamirs.configure.converter.annotation否ModelConverter接口实现类名
元数据模型签名器白名单yaml:pamirs.configure.signer否ModelSigner接口实现类名
注解转化器处理的元模型的扫描路径配置yaml:pamirs.meta.meta-packages否默认:
pro.shushi.pamirs.meta.domain
pro.shushi.pamirs.boot.base.model

(三)元数据计算 ​

扩展点实现位置SPI接口
模型编码接口*是ModelModelApi
模型运算接口*是ModelComputeApi
模型校验接口*是ModelCheckApi
模型指令接口*是ModelDirectiveBatchApi
ORM转换接口*是OrmApi
类型系统接口*是TypeProcessor
继承处理扩展逻辑*是InheritedExtendProcessor
模型计算扩展逻辑*是ModelExtendComputer
字段计算扩展逻辑*是FieldExtendComputer
元数据计算扩展逻辑*是MetaDataExtendComputer

(四)API层 ​

扩展点实现位置SPI接口
请求上下文扩展点*是SessionPrepareApi
拦截器构建扩展点*是InstrumentationApi
动作绑定扩展点*是ActionBinderApi
数据加载器注册扩展点*是DataLoaderRegistryApi

(五)FaaS层 ​

扩展点实现位置SPI接口
组装表达式上下文*是SessionContextApi
商业函数扩展点*是BusinessFunctionsApi
上下文函数扩展点*是ContextFunctionsApi
表达式可执行函数黑白名单*是FaasScriptAllowListApi

(六)ORM层 ​

扩展点实现位置SPI接口
前端字段处理扩展逻辑*是FrontEndFieldExtendConverter
前端字段计算*否FieldValueComputer
后端字段处理扩展逻辑*是BackEndFieldExtendConverter
字段序列化api*否Serializer

(七)持久层 ​

扩展点实现位置SPI接口
数据源路由pamirs-boot-*
yaml:pamirs.mapper.data-source-route-service
是DataSourceRouteService#route
数据框架的统一key前缀服务*是DataApiKeyService
动态数据源路由自定义参数pamirs-boot-*
yaml:pamirs.mapper.dynamic-ds-key-computer
是DynamicDsKeyComputer
数据表名计算自定义参数pamirs-boot-*
yaml:pamirs.mapper.table-name-computer
是TableNameComputer#context
获取逻辑字段定义pamirs-connectors-data-*
**yaml:pamirs.mapper.**logic-column-fetcher
是LogicColumnFetcher
#fetchLogicColumnDefinitions
获取逻辑字段pamirs-connectors-data-*
**yaml:pamirs.mapper.**logic-column-fetcher
是LogicColumnFetcher
#fetchLogicColumns
通用mapper*否PamirsMapper