java的spi 的簡單應用


1.什么是java的spi

SPI 全稱為 (Service Provider Interface) ,是JDK內置的一種服務提供發現機制。 目前有不少框架用它來做服務的擴展發現, 簡單來說,它就是一種動態替換發現的機制, 舉個例子來說, 有個接口,想運行時動態的給它添加實現,你只需要添加一個實現。

具體是在JAR包的"src/META-INF/services/"目錄下建立一個文件,文件名是接口的全限定名,文件的內容可以有多行,每行都是該接口對應的具體實現類的全限定名.

 

2.運用場景

比如你想擴展一些框架,如spring的一些功能,就是要實現它接口,然后自己配置了。

 

3.例子代碼

先定義接口:

  

package com.ming.spi.service;

/**
 * 定義一個dog的接口
 * @author ming
 *
 */
public interface DogService {

    void sleep();
}

然后定義兩個實現:

package com.ming.spi.service.imp;

import com.ming.spi.service.DogService;

public class BlackDogServiceImpl implements DogService{

    @Override
    public void sleep() {
        System.out.println("黑色dog。。。汪汪叫,不睡覺...");
        
    }
    
}
package com.ming.spi.service.imp;

import com.ming.spi.service.DogService;

public class WhilteDogServiceImpl implements DogService{

    @Override
    public void sleep() {
        System.out.println("白色dog。。。呼呼大睡覺...");
        
    }

}

最后是一個測試代碼:

package com.ming.spi.service;

import java.util.ServiceLoader;

public class Test {

    public static void main(String[] args) throws Exception {
        ServiceLoader<DogService> loaders = ServiceLoader.load(DogService.class);
        for (DogService d : loaders) {
            d.sleep();
        }
    }
}

 

然后是src/META-INF/services/com.ming.spi.service.DogService文件中的代碼:

com.ming.spi.service.imp.BlackDogServiceImpl
com.ming.spi.service.imp.WhilteDogServiceImpl

 

最后運行結果就是你需要的兩個實現。

 

最后總結一下:

java的spi運行流程是運用java.util.ServiceLoader這個類的load方法去在src/META-INF/services/尋找對應的全路徑接口名稱的文件,然后在文件中找到對應的實現方法並注入實現,然后你可以運用了

 

 

參考:http://www.cnblogs.com/zhongkaiuu/articles/5040971.html

 

 用得越多不知道的東西越多......慢慢醬油中...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM