基于 Spring & SPI 实现动态服务配置实践
定义一个接口,如何优雅的根据一个接口来获取该接口的实现类呢?
以 Site 国际化为例,一般是各个国家有各个国家的 Service,各个国际的 Service 由各个国家的 team 维护,那在统一框架下,如何实现获取动态服务,由此 SPI 引入眼帘。
SPI - Service Provider Interface
SPI 全称为(Service Provider Interface),是 JDK 内置的一种服务提供发现机制,它是一种动态替换发现服务实现者的机制。简单地理解,这是建立在面向接口编程下的一种为了使组件可扩展或动态变更实现的规范。
常见的类 SPI 的设计有 JDBC、JNDI、JAXP 等,很多开源框架的内部实现也采用了 SPI。
1、在 mysql-connector-java-xxx.jar 中发现了 META-INF\services\java.sql.Driver 文件
2、在 jcl-over-slf4j-xxxx.jar 中发现了 META-INF\services\org.apache.commons.logging.LogFactory 文件
3、Dubbo 基于 SPI 实现了强大灵活的扩展机制
自定义 SPI
为什么要自定义 SPI ?
在实际应用中,无论是 Java SPI 或是 Spring SPI,都无法服务与工程已有 Spring 容器进行整合。
举个栗子:订单 OrderService 的 Implement 是通过 SPI 方式创建的,可如果 OrderService 实现类中调用了 Spring 容器管理的商品 WareService,则会出现 null 异常,因为 OrderService 实现类的生命周期并没有交给 Spring 容器管理。
基于此,我们可以自己实现一套逻辑,主要包括两点:
-
1、加载 META-INF 目录下的 spi 接口文件
-
2、将实例化的 Bean 注册到 Spring 的容器中
具体的实现,访问 Github:https://github.com/linkedkeeper/spi-imp
获取更多Java高级架构最新视频,
加入Java进阶架构交流群:142019080。直接点击链接加群。https://jq.qq.com/?_wv=1027&k=5lXBNZ7
- 基于spring-cloud相关技术整合,实现接口调用、服务容错、动态路由配置等
- Spring Cloud Alibaba实现服务配置管理和动态服务发现(使用Nacos)
- Spring Boot 实践3 --基于spring cloud 实现微服务的简单调用
- 让IoC动态解析自定义配置(提供基于Unity的实现)
- 【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(二)
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- 基于spring,Atomikos,mybatis的分布式动态数据源JTA实现
- Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务
- 基于spring的aop实现读写分离与事务配置
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
- 基于Mailslot技术的日志服务之Client端实现:单子模式,缓存, 支持在动态链接库中输出Log打印信息
- Spring动态对Quartz定时任务的管理,实现动态加载,停止的配置实例代码
- Spring AOP(3)基于XML配置实现的示例
- Spring动态对Quartz定时任务的管理,实现动态加载,停止的配置实例代码
- Spring 配置多个数据源,并实现动态切换
- 基于Spring-DM实现分布式服务框架(DSF)(一)
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【四】——实现模型工厂,依赖注入以及格式配置
- Spring(四)基于注解配置IOC容器&基于注解实现声明式事务
- 使用Spring 实现 定时服务 的相关配置问题。
- 【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(转)