spi机制适配多环境

场景:

1.我正在写一个框架,我想同时兼容spring环境、solon环境或者其他等等。同时还支持用户自定义或者进行覆盖。

像这种场景,一般使用spi结合优先级加载以及插件式进行加载,简单来说,举个简单例子:

用户a,spring项目,只需要引入我的 my-spring依赖,solon项目引入my-solon依赖

其他不支持的项目,引入my-core依赖,进行自实现

又或者用户spring环境,不想用框架内部的,用户可以自实现一个优先级更高的进行覆盖。

  1. my-core,定义spi接口,优先级最低为2,并进行默认空实现或其他实现

2.my-spring,定义spring的实现,优先级为1

3.my-solon,定义solon的实现,优先级为1

核心代码:

1.my-core:

1.1 顶层接口,定义加载的优先级方法

java 复制代码
/**
 * Spi实现的优先级接口 数字越小优先级越高
 */
public interface SpiPriority {

	int priority(); //优先级

}

1.2 业务接口继承

java 复制代码
/**
 * 环境加载接口
 *
 */
public interface Init extends SpiPriority {

	void envInit(Object obj); //加载环境

}

1.3 空实现

java 复制代码
/**
 * 环境加载local接口
 *
 */
public class LocalInit implements Init{

	void envInit(Object obj){ throw new RuntimeException("找不到具体实现类,请自实现或根据项目环境引入依赖")} 

    int priority(){return 2;}

}

1.4 spi配置

MATE_INF/services新建文件名为Init的全路径名,内容为localInit的全路径名

2.my-spring

实现Init接口,并配置spi配置

3.加载时机

一般在项目启动的时候进行加载

如spring环境,实现SmartInitializingSingleton,在单例bean全部实例化后执行

java 复制代码
        if (ObjectUtil.isNull(init)) {
			List<Init> list = new ArrayList<>();
			ServiceLoader.load(Init.class).forEach(list::add);
			list.sort(Comparator.comparingInt(Init::priority));
			init= list.get(0);
		}
		return init;

4.用户自实现或覆盖g

如spring环境 调整优先级即可,加上@component注解或者spi配置选择一种即可

java 复制代码
int priority(){return 0;}//调整优先级
相关推荐
小兔崽子去哪了1 小时前
Java 自动化部署
java·后端
ma_king1 小时前
入门 java 和 数据库
java·数据库·后端
后端AI实验室1 小时前
我用Cursor开发了3个月,整理出这套提效4倍的工作流
java·ai
码路飞6 小时前
GPT-5.3 Instant 终于学会好好说话了,顺手对比了下同天发布的 Gemini 3.1 Flash-Lite
java·javascript
SimonKing6 小时前
OpenCode AI编程助手如何添加Skills,优化项目!
java·后端·程序员
Seven978 小时前
剑指offer-80、⼆叉树中和为某⼀值的路径(二)
java
怒放吧德德19 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆21 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
心之语歌1 天前
基于注解+拦截器的API动态路由实现方案
java·后端
华仔啊1 天前
Stream 代码越写越难看?JDFrame 让 Java 逻辑回归优雅
java·后端