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;}//调整优先级
相关推荐
wuminyu1 小时前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
callJJ3 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
wbs_scy3 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
jinanwuhuaguo5 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
xmjd msup5 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
952366 小时前
SpringBoot统一功能处理
java·spring boot·后端
Lyyaoo.6 小时前
优惠券秒杀业务分析
java·开发语言
消失的旧时光-19436 小时前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法
勿忘初心12216 小时前
Java 国密 SM4 加密工具类实战(Hutool + BouncyCastle)|企业级数据加密 + 兼容 JDK8
java·数据安全·数据加密·后端开发·企业级开发·国密 sm4
庞轩px6 小时前
第8篇:原子类与CAS底层原理——无锁并发的实现
java·cas·乐观锁·aba·无锁编程·自旋