Java spi 和Spring spi
service provider framework是一个系统, 实现了SPI, 在系统里多个服务提供者模块可以提供一个服务的实现, 系统让客户端可以使用这些实现, 从而实现解耦。
一个service provider framework有3个主要的组成部分:
- 一个服务接口, 供服务提供者实现。
- 一个注册API, 系统使用这个API来注册服务接口的实现, 从而让客户端使用。
- 一个service access API, 客户端可以选择获取一个服务的实例。
Java SPI:
Service Provider Interface(SPI)是一个可以被第三方扩展或实现的API, 它可以用来实现框架扩展和可替换的模块。
使用步骤:
- 服务调用方通过ServiceLoader.load加载服务接口的实现类实例
- 服务提供方实现服务接口后, 在自己Jar包的META-INF/services目录下新建一个接口名全名的文件, 并将具体实现类全名写入。
Spring SPI
很多开源库中都直接或间接地使用了Java的SPI机制, 如Spring中就有类似的SPI机制, 通过SpringFactoriesLoader代替JDK中的ServiceLoader, 通过META-INF/spring.factories文件代替META-INF/service目录下的描述文件, 原理都是使用了Java的反射机制。
Spring提供的SPI只需要且只有一个文件, 就是META-INF/spring.factories
Spring的SPi也更加灵活, 不必要key是接口, 值是实现类, 例如Spring boot使用这种方式来处理自动配置的bean: key是注解(如org.springframework.boot.autoconfig.EnableAutoConfiguration), 值是被标记@Configuration的类。
另外Spring中还有converter spi和formatter spi。
converter可以用做任意两个类型之间的转换, formatter spi用做string类型和其他类型之间的转换。
Converter和Formatter接口即服务接口
ConersionService实现了ConverterRegistry接口, 提供服务实现的注册, 同时也提供可访问功能。
而FormattingConversionService
则实现了FormatterRegistry接口, 实现了formatter实现类的注册和调用。 同时FormattingConversionService也实现了ConversionService接口。
Java spi 和Spring spi的更多相关文章
- 剖析 SPI 在 Spring 中的应用
vivo 互联网服务器团队 - Ma Jian 一.概述 SPI(Service Provider Interface),是Java内置的一种服务提供发现机制,可以用来提高框架的扩展性,主要用于框架的 ...
- Dubbo 扩展点加载机制:从 Java SPI 到 Dubbo SPI
SPI 全称为 Service Provider Interface,是一种服务发现机制.当程序运行调用接口时,会根据配置文件或默认规则信息加载对应的实现类.所以在程序中并没有直接指定使用接口的哪个实 ...
- Java SPI 与 Dubbo SPI
SPI(Service Provider Interface)是JDK内置的一种服务提供发现机制.本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类.这样可以在运行时,动 ...
- Spring SPI 机制总结
1.概念: SPI(Service Provider Interface)服务提供接口,简单来说就是用来解耦,实现插件的自由插拔,具体实现方案可参考JDK里的ServiceLoader(加载class ...
- 初识轻量级Java开源框架 --- Spring
初识轻量级Java开源框架 --- Spring 作者:egg 微博:http://weibo.com/xtfggef 出处:http://blog.csdn.net/zhangerqing spri ...
- spring实战六之使用基于java配置的Spring
之前接触的都是基于XML配置的Spring,Spring3.0开始可以几乎不使用XML而使用纯粹的java代码来配置Spring应用.使用基于java配置的Spring的步骤如下: 1. 创建基于ja ...
- java DI 框架spring(web)、Guice(web)、Dagger&Dagger2(android)
java DI 框架spring(web).Guice(web).Dagger&Dagger2(android) (待续...)
- 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置
经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - ...
- java企业架构 spring mvc +mybatis + KafKa+Flume+Zookeeper
声明:该框架面向企业,是大型互联网分布式企业架构,后期会介绍linux上部署高可用集群项目. 项目基础功能截图(自提供了最小部分) 平台简介 Jeesz是一个分布式的框架,提供 ...
随机推荐
- intellij idea 搜索快捷键
Ctrl+N按名字搜索类 1 相当于eclipse的ctrl+shift+R,输入类名可以定位到这个类文件 2 就像idea在其它的搜索部分的表现一样,搜索类名也能对你所要搜索的内容多个部分进行匹配 ...
- LeetCode 931. Minimum Falling Path Sum
原题链接在这里:https://leetcode.com/problems/minimum-falling-path-sum/ 题目: Given a square array of integers ...
- 如何防止CSRF攻击?
CSRF攻击 CSRF漏洞的发生 相比XSS,CSRF的名气似乎并不是那么大,很多人都认为CSRF“不那么有破坏性”.真的是这样吗? 接下来有请小明出场~~ 小明的悲惨遭遇 这一天,小明同学百无聊赖地 ...
- 最近在弄ionic3的时候遇到的一些问题(遇到就更新)
问题一(install提示errno -4048 和管理员权限) npm install npm ERR! code EPERM npm ERR! errno - npm ERR! syscall u ...
- 配置nRF52832 的NFC 专用引脚为 GPIO
nRF52832 是支持NFC的,真可惜本码农没用过. NFC的引脚为 P0.09/P0.10,这两个引脚正常情况下是不能直接当做GPIO来用的,要用的时候,需要在编译环境配置一个宏. 下面是Keil ...
- html5 css3 背景视频循环播放代码
<div style ="position: absolute; z-index: -1; top: 0px; left: 0px; bottom: 0px; right: 0px; ...
- spring @Autowired注入map
注入map,平常一般不会这么做,今天看一段老代码时发现有这么个用法.补习一下. @Autowired 标注作用于 Map 类型时,如果 Map 的 key 为 String 类型,则 Spring 会 ...
- t4模版快速入门
语法 主要包括指令.文本块.控制块. 1.指令 指令主要包括template, output, assembly, import, include等类型,用以告诉T4引擎如何编译和运行一个模板.这些指 ...
- Python之schedule用法,类似linux下的crontab
# -*- coding: utf-8 -*- # author:baoshan import schedule import time def job(): print("I'm work ...
- 泡泡一分钟:Using Geometric Features to Represent Near-Contact Behavior in Robotic Grasping
张宁 Using Geometric Features to Represent Near-Contact Behavior in Robotic Grasping链接:https://pan.ba ...