一、什么是 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);
});
}
}
}

Spring SPI、Solon SPI 有点儿像(Maven 与 Gradle)的更多相关文章

  1. Spring 4 MVC+Hibernate 4+MySQL+Maven使用注解集成实例

    Spring 4 MVC+Hibernate 4+MySQL+Maven使用注解集成实例 转自:通过注解的方式集成Spring 4 MVC+Hibernate 4+MySQL+Maven,开发项目样例 ...

  2. Spring MVC第一课:用IDEA构建一个基于Spring MVC, Hibernate, My SQL的Maven项目

    作为一个Spring MVC新手最基本的功夫就是学会如何使用开发工具创建一个完整的Spring MVC项目,本文站在一个新手的角度讲述如何一步一步创建一个基于Spring MVC, Hibernate ...

  3. 为什么 Spring Boot 2.3.0 放弃Maven最终拥抱Gradle

    在 2.3.0 中对 Spring Boot 进行了相当重大的更改,这是使用 Gradle 而非 Maven 构建的项目的第一个版本. Spring 的每个项目都独立的项目组在开发运营,在用户最常使用 ...

  4. Maven实战——Gradle,构建工具的未来?

    许晓斌-- 四月 05, 2011 Maven面临的挑战 软件行业新旧交替的速度之快往往令人咂舌,不用多少时间,你就会发现曾经大红大紫的技术已经成为了昨日黄花,当然,Maven也不会例外.虽然目前它基 ...

  5. 从零开始,跟我一起做jblog项目(三)从Maven到Gradle

    http://www.cnblogs.com/newflydd/p/4972922.html?utm_source=tuicool&utm_medium=referral ********** ...

  6. Gradle快速上手——从Maven到Gradle

    [本文写作于2018年7月5日] 本文适合于有一定Maven应用基础,想快速上手Gradle的读者. 背景 Maven.Gradle都是著名的依赖管理及自动构建工具.提到依赖管理与自动构建,其重要性在 ...

  7. Maven和Gradle对比

    Java世界中主要有三大构建工具:Ant.Maven和Gradle.经过几年的发展,Ant几乎销声匿迹.Maven也日薄西山,而Gradle的发展则如日中天.笔者有幸见证了Maven的没落和Gradl ...

  8. Java构建工具:如何用Maven,Gradle和Ant+Ivy进行依赖管理

    原文来自:https://zeroturnaround.com/rebellabs/java-build-tools-how-dependency-management-works-with-mave ...

  9. Maven、gradle、Ant、Eclipse IDE

    Maven.gradle.Ant.Eclipse IDE之间的关系 http://wenku.baidu.com/view/d33208810912a21615792910.html?from=sea ...

  10. Maven和Gradle

    Maven和Gradle对比 Java世界中主要有三大构建工具:Ant.Maven和Gradle.经过几年的发展,Ant几乎销声匿迹.Maven也日薄西山,而Gradle的发展则如日中天.笔者有幸见证 ...

随机推荐

  1. ELT已死,EtLT才是现代数据处理架构的终点!

    提到数据处理,经常有人把它简称为"ETL".但仔细说来,数据处理经历了ETL.ELT.XX ETL(例如,Reverse ETL.Zero-ETL)到现在流行的EtLT架构几次更迭 ...

  2. JS Map对象与map方法

    前言  最近遇到一个遍历的问题,查资料的过程中,发现有个 Map 对象,提供了很多方法可以轻松地获取我们想要的数据,之前只知道有 map ,没想到还有 Map ,是不是有点绕?不急,这两个东西都是虽然 ...

  3. 3. EMC EMS EMI

    1. 定义 1.1 EMC(Electromagnetic Compatibility) 电磁兼容性(EMC)是指系统正常工作的能力,不受其正常环境中电磁现象的干扰,不产生干扰其他设备的电干扰. 1. ...

  4. cloud compare PCA插件开发详细步骤(二)附代码

    在上一节 https://blog.csdn.net/csy1021/article/details/141200135 我们已经完成了 具体开发前的准备工作,包括 各级 CMakelists.txt ...

  5. 【CMake系列】02-第一个CMake项目

    本节我们用CMake 构建我们的第一个helloword的项目,从更细的粒度上了解CMake在做什么,对编写CMakeLists.txt 进入初步引入 本专栏的实践代码全部放在 github 上,欢迎 ...

  6. C语言编程-GCC编译过程

    gcc编译 预处理 ->编译->汇编->链接 预处理 gcc -E helloworld.c -o helloworld.i 头文件展开:不检查语法错误,即可以展开任意文件: 宏定义 ...

  7. keepalived编译安装-麒麟v10Arm64

    环境信息 操作系统: Kylin Linux Advanced Server V10 (Lance) 架构:Arm keepalived版本:2.3.1 编译 wget https://www.kee ...

  8. sublime text _正则表达式01

    概述 sublime 常用正则表达式 预备工作:打开sublime之后,ctrl+h,点选使用正则表达式. (\S+) :匹配所有符号外的字符 用到的地方: 小明 小黄 小红 (构造批量插入sql语句 ...

  9. 为什么说 Swoole 是 PHP 程序员技术水平的分水岭?

    大家好,我是码农先森. 谈到这个话题有些朋友心中不免会有疑惑,为什么是 Swoole 而不是其他呢?因为 Swoole 是基于 C/C++ 语言开发的高性能异步通信扩展,覆盖的特性足够的多,有利于 P ...

  10. 导出 LaTeX 为 SVG

    LaTeX 本身并不直接支持导出 SVG 格式的文档或图片,但可以通过一些工具和插件实现将 LaTeX 文档或图形转换为 SVG 格式. 使用 dvisvgm 我们可以先将 LaTeX 文档编译为 D ...