🔥 Spring SPI、Solon SPI 有点儿像(Maven 与 Gradle)?


一、什么是 SPI

SPI 全名 Service Provider interface,翻译过来就是“服务提供接口”。基本效果是,申明一个接口,然后通过配置获取它的实现,进而实现动态扩展。

Java SPI 是 JDK 内置的一种动态加载扩展点的实现。

一般的业务代码中较少用到,但是在底层框架中却大量使用,包括 JDBC、Dubbo、Spring、Solon、slf4j 等框架都有用到,不同的是有的使用 Java 原生的实现,有的框架则自己实现了一套 SPI 机制.

二、Spring SPI

Spring 中的 SPI 相比于 JDK 原生的,它的功能更强大些,它可以替换的类型不仅仅局限于接口/抽象类,它可以是任何一个类,接口,注解;

正因为 Spring SPI 是支持替换注解类型的 SPI,这个特性在 Spring Boot 中的自动装配有体现(EnableAutoConfiguration注解):

Spring 的 SPI 配置文件,需要放在工程的 META-INF 下,且文件名为 spring.factories ,而文件的内容本质就是一个 properties;如 spring-boot-autoconfigure 包下的 META-INF/spring.factories 文件,用于自动装配的。

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration, \
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration, \
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration, \
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration, \
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration, \
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,

三、Solon SPI

相对于 Java SPI 和 Spring SPI 的“配置式”风格。Solon SPI 则是 “编码式” 风格。就有点儿像 Maven 和 Gradle。Solon SPI,也称为 Solon Plugin SPI。 同样需要一个配置文件,来申明 Plugin 的实现类。

约定插件配置文件,且要求文件名是唯一的:

#建议使用包做为文件名,便于识别,且可避免冲突
META-INF/solon/{packname}.properties

约定插件配置内容(就固定的两项):

#插件实现类配置
solon.plugin={PluginImpl}
#插件优化级配置。越大越优先,默认为0
solon.plugin.priority=1

插件代码示例(相当于,为整个 “模块” 提供了一个生命周期)。把上面 Spring SPI 的配置翻译过来就是:

public class SpringTranslatePlugin implements Plugin{
@Override
public void start(AppContext context) {
//插件启动时...
context.beanMake(SpringApplicationAdminJmxAutoConfiguration.class);
context.beanMake(AopAutoConfiguration.class);
context.beanMake(RabbitAutoConfiguration.class);
context.beanMake(BatchAutoConfiguration.class);
context.beanMake(CacheAutoConfiguration.class);
context.beanMake(CassandraAutoConfiguration.class);
}

@Override
public void prestop() throws Throwable {
//插件预停止时(启用安全停止时:预停止后隔几秒才会进行停止)
}

@Override
public void stop(){
//插件停止时
}
}

因为是 “编码式” 的。所以也可以做更复杂的控制处理。比如:

public class SolonDataPlugin implements Plugin {
@Override
public void start(AppContext context) {
//注册缓存工厂
CacheLib.cacheFactoryAdd("local", new LocalCacheFactoryImpl());

//添加事务控制支持
if (context.app().enableTransaction()) {
context.beanInterceptorAdd(Tran.class, TranInterceptor.instance, 120);
}

//添加缓存控制支持
if (context.app().enableCaching()) {
CacheLib.cacheServiceAddIfAbsent("", LocalCacheService.instance);

context.subWrapsOfType(CacheService.class, new CacheServiceWrapConsumer());

context.lifecycle(() -> {
if (context.hasWrap(CacheService.class) == false) {
context.wrapAndPut(CacheService.class, LocalCacheService.instance);
}
});

context.beanInterceptorAdd(CachePut.class, new CachePutInterceptor(), 110);
context.beanInterceptorAdd(CacheRemove.class, new CacheRemoveInterceptor(), 110);
context.beanInterceptorAdd(Cache.class, new CacheInterceptor(), 111);
}

//自动构建数据源
Props props = context.cfg().getProp("solon.dataSources");
if (props.size() > 0) {
context.app().onEvent(AppPluginLoadEndEvent.class, e -> {
//支持 ENC() 加密符
VaultUtils.guard(props);
buildDataSource(context, props);
});
}
}
}

相關推薦

2024-07-16

码中。只需要在项目中引入 smart-doc 提供的 maven 或者是 gradle 插件,然后按照规范写好 javadoc 注释即可生成 api 文档。同时 smart-doc 也支持生成 openapi 和 postman 这些规范的文档,生成后可以直接导入相关工具做测试。 目前在国内

2023-12-05

、PHP、JavaScript 和其他编程语言。 一些更新内容包括: Gradle 返回所有 loaders 的最高质量 #6371 将 Gradle Tooling API 更新到 8.4 #6553 不要在每个项目上都要求代理 #6558 #6536、#6537:避免堆栈溢出,捕获要下载的丢失

2023-07-11

代码接口定义自动推导,强大的返回结构推导。 支持 Spring MVC,Spring Boot,Spring Boot Web Flux (controller 书写方式),JAX-RS 规范。 支持 Callable,Future,CompletableFuture 等异步接口返回的推导。 支持 JavaBean 上的 JSR303 参数校验规范,支持分

2022-11-03

代码接口定义自动推导,强大的返回结构推导。 支持 Spring MVC,Spring Boot,Spring Boot Web Flux (controller 书写方式),JAX-RS 规范。 支持 Callable,Future,CompletableFuture 等异步接口返回的推导。 支持 JavaBean 上的 JSR303 参数校验规范,支持分

2024-08-20

实现方式 支持角色、部门和用户等权限配置 同时支持spring和solon 兼容java8和java17,理论11也可以 官方提供基于ruoyi-vue封装实战项目,很实用 流程流转管理 流程流转就像是warm-flow的驾驶人。让办理流程像喝水一样简单的

2022-11-08

都放在配置中心,对业务代码零侵入 轻量简单:基于 springboot 实现,引入 starter,接入只需简单4步就可完成,顺利3分钟搞定 高可扩展:框架核心功能都提供 SPI 接口供用户自定义个性化实现(配置中心、配置文件解析、

2023-02-09

服务启动时会从配置中心拉取配置生成线程池对象放到 Spring 容器中,使用时直接从 Spring 容器中获取,对业务代码零侵入 通知告警:提供多种报警维度(配置变更通知、活性报警、容量阈值报警、拒绝触发报警、任务执行或

2023-03-30

服务启动时会从配置中心拉取配置生成线程池对象放到 Spring 容器中,使用时直接从 Spring 容器中获取,对业务代码零侵入 通知告警:提供多种报警维度(配置变更通知、活性报警、容量阈值报警、拒绝触发报警、任务执行或

2024-08-27

::body 的兼容性,避免不可读情况 优化 solon 调试模式与 gradle 的兼容性 优化 solon.boot FormUrlencodedUtils 预处理把 post 排外 优化 solon.web.rx 允许多次渲染输出 优化 kafka-solon-cloud-plugin 添加 username, password 简化配置支持(简化有账

2023-05-06

经过社区成员的投票,X.Org 基金会将脱离公益软件协会 SPI  转到软件自由保护协会 SFC 的旗下,由  SFC 作为其财务赞助商及管理者。  公益软件协会 SPI 全称 Software in the Public Interest,起初是为了公开透明地

2023-03-21

ndencies 更新 redis 版本 3.6.3 到 4.3.1 更新 maven-assembly-plugin 3.1.1 到 3.5.0 #272 更新 antlr4 4.9.3 到 4.12.0 #262 更新 jedis 3.6.3 到 4.3.1 #254 更新 DmJdbcDriver18 8.1.2.141 到&

2023-08-24

时、爽快)!以知名开源项目“小诺”为例: “snowy-spring 版” 启动 15-50秒 “snowy-solon 版” 启动3-5秒,内存节省1/3(有兴趣的,欢迎拉取代码体验) 相对于 Spring Boot 和 Spring Cloud 的项目,有什么特点? 启动快

2023-07-14

Spring Initializr 0.20.0 已经发布,此版本添加了许多新功能和改进。 Spring initializr 是一个 Spring 项目的快速开始生成器。其提供了一个可扩展的 API 来生成基于 JVM 的项目,并带有几种常见概念的实现。该版本包括 27 个修复

2024-10-17

持了 TC 多节点之间的元数据同步功能;Saga 事务模式与 Spring 框架解耦。 兼容性方面,针对原 io.seata 的 package 中的 API 做了全面的兼容处理,以保证从低版本升级至 Apache 版本上无需要修改任何代码。 另外,本次发布共通过了