java.util.ServiceLoader

2013-12-16T00:00:00+00:00 Java

まぁJavaやってるとたまーにみるMETA-INF/servicesっていうディレクトリにファイルがあってその中身が実装クラスのFQDNが書いてるっていうケース。こういう仕組みを作るにはどうするのかっていうのをやってみた

ServiceLoaderで処理される側な部分

つまりMETA-INF/servicesに記載する部分。まずservices内にあるファイル名はインターフェース名な模様。なのでインターフェースを作る

package sample;

public interface Sample {
    String say();
}

っていう感じで作ればMETA-INF/services/sample.Sampleっていうファイルを作って中身にはそのインターフェースを実装したクラスのFQDNを書けば良い。今回はsample.SampleImplって感じにしておいた。まぁjar tvfすると

0 Mon Dec 16 13:15:16 JST 2013 sample/
   388 Mon Dec 16 13:15:16 JST 2013 sample/SampleImpl.class
   137 Mon Dec 16 13:15:16 JST 2013 sample/Sample.class
     0 Mon Dec 16 13:09:50 JST 2013 META-INF/services/
    18 Mon Dec 16 13:09:50 JST 2013 META-INF/services/sample.Sample

っていう感じになる。んでこれを使う

ServiceLoaderを使う

まぁ上記で生成したjarファイルをビルドパスに入れてと

import java.util.ServiceLoader;
import sample.Sample;

public class Main {
    public static void main(String[] args) {
        ServiceLoader<sample> loader = ServiceLoader.load(Sample.class);

        for (Sample sample : loader) {
            System.out.println(sample.getClass());
            System.out.println(sample.say());
        }
    }
}

っていう感じでjava.util.ServiceLoaderを使う事で、META-INF/servicesで定義されているインターフェースで取得しその実装を利用する事が出来る感じかと

jsp-config Spring WebMVCをやってみる (10) - gsonを使う -