ServiceLoader原理解析

最近在公司的項目裏看到了ServiceLoader這個類,就好奇地去了解了一下。我們都知道,根據一個類去找它的父類或者接口那很簡單。畢竟類加載的時候,相關信息都加載進去了。但反過來就不簡單了,那就是根據接口去找所有實現類。

這個類主要作用就是加載某個接口的實現類。類似的功能,我以前用註解的形式實現過。就是掃描包,然後根據註解信息判斷是否是某個類的子類,然後進行加載。

但這顯然是個不大好的方法,因爲掃描包成本高嘛,所以jdk就提供了這麼一個工具類,java.util.ServiceLoader。

其實這個類實現也很簡單,

 

private static final String PREFIX = "META-INF/services/";

他定義了這麼一個路徑,你只需要去該路徑下配置相關信息就行。那配置的是啥呢,也很簡單,那就是接口和實現類的全類名。

 

文件名就是接口全類名,沒有後綴。

裏面的內容就是實現類的全類名:

com.app.test.FaceImpl0
com.app.test.FaceImpl1
  1.  

Face.java

package com.app.test;

/**
* Created by Tim on 2017/7/11.
*/
public interface Face {
    void doSome();
}

FaceImpl0.java

package com.app.test;/**
* Created by Tim on 2017/7/11.
*/

/**
* create by 陳樟傑
*/
public class FaceImpl0 implements Face {
@Override
public void doSome() {
    System.out.println("實現類---0");
}
}

​​​​​​​FaceImpl1.java

package com.app.test;/**
* Created by Tim on 2017/7/11.
*/

/**
* create by 陳樟傑
*/
public class FaceImpl1 implements Face {
@Override
public void doSome() {
    System.out.println("實現類---1");
}
}

JavaTest.java

package com.app.test;/**
* Created by Tim on 2017/7/11.
*/

import java.util.ServiceLoader;
/**
* create by 陳樟傑
*/
public class JavaTest {
    public static void main(String[] args) {
        ServiceLoader<Face> serviceLoader = ServiceLoader.load(Face.class);
        for(Face face:serviceLoader) {
            face.doSome();
        }
    }
}

運行結果:

實現類---0
實現類---1

這個類實現了迭代器,所以遍歷時非常簡單。

public final class ServiceLoader<S>
    implements Iterable<S>

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/JobsandCzj/article/details/74985294

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章