Java中 SPI的使用
生活随笔
收集整理的這篇文章主要介紹了
Java中 SPI的使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Java中 SPI的使用
SPI(Service Provider Interface), 實際上是“基于接口的編程+策略模式+配置文件”組合實現的動態加載機制。
1,SPI 的使用場景
SPI一般使用在一個接口有多個實現的情況,在外界無感的情況下可以實現自動的切換。比如在發短信的場景下,有多個供應商,可以使用SPI來做,保證服務的高可用。
如圖:
實現一個動態加載的一個過程。
2,SPI 如何使用
2.1 有一個頂層接口
package com.test; public interface MessageSender {void send(); }2.2 有一些底層實現
實現1:
package com.test; public class ChinaMobileMessageSender implements MessageSender {@Overridepublic void send() {System.out.println("我是移動,我給你發短信");} }實現2:
package com.test; public class UnicomMessageSender implements MessageSender {@Overridepublic void send() {System.out.println("我是聯通,我給你發短信");} }2.3 寫一個配置文件,特定目錄下,特定名稱,特定內容
在類路徑(Spring架構下是src/main/resources 下即可)下創建/META-INF/services層次的文件夾,然后文件夾里創建以頂層接口全路徑為名的文件,如圖:
文件內容為每一個實現類的全路徑為一行,如:
com.test.ChinaMobileMessageSender com.test.UnicomMessageSender3 測試一下 SPI
public static void main(String[] args) {ServiceLoader<MessageSender> serviceLoader = ServiceLoader.load(MessageSender.class);for (MessageSender messageSender : serviceLoader) {messageSender.send();}}console 輸出:
我是移動,我給你發短信 我是聯通,我給你發短信4,總結
SPI 就是一個動態加載配置文件的策略模式實現,實現了解耦,可以自動加載到所有的子類,但是我也遇到一些問題。
1,在Spring的體系下,不知道是否可以做到加載到Spring容器中,從而使用其他的Spring加載的類。
2,不能動態選擇使用的是哪一個子類,可能需要自己判斷。
3,多線程下加載可能會有問題,所以還是需要初始化時加載好。
4,加載會一次性把所有子類都加載了,不能選擇性加載。
總結
以上是生活随笔為你收集整理的Java中 SPI的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 写接口文档及生成mock数据
- 下一篇: Mysql对string类型转换int类