serviceLoader&autoService简单使用

106 阅读1分钟

serviceLoader

定义

我写个接口,那么我可以找到所以实现该接口的类,然后调用它的方法

步骤

1、写一个接口
public interface IMyServiceLoader {
    String sayHello();
​
    String getName();
}
2、写两个实现
package com.example.spi;
​
public class MyServiceLoaderImpl1 implements IMyServiceLoader {
    @Override
    public String sayHello() {
        return "hello1";
    }
​
    @Override
    public String getName() {
        return "name1";
    }
}
​
package com.example.spi;
​
public class MyServiceLoaderImpl2 implements IMyServiceLoader {
    @Override
    public String sayHello() {
        return "hello2";
    }
​
    @Override
    public String getName() {
        return "name2";
    }
}
​
3、写个接口实现类文件
  • 当服务的提供者提供了服务接口的一种实现之后,在resource的META-INF/services/ 目录里同时创建一个以服务接口命名的该服务接口具体实现类文件

image.png

  • 文件中将接口实现写上

    • com.example.spi.MyServiceLoaderImpl1
      com.example.spi.MyServiceLoaderImpl2
      
4、调用
public class TestMyServiceLoader {
    public static void main(String[] argus){
        ServiceLoader<IMyServiceLoader> serviceLoader = ServiceLoader.load(IMyServiceLoader.class);
        for (IMyServiceLoader myServiceLoader : serviceLoader){
            System.out.println(myServiceLoader.getName() + myServiceLoader.sayHello());
        }
    }
}

AutoService

定义

就是懒得写这个接口申明文件了,让代码自己给我写

步骤

1、导包
annotationProcessor 'com.google.auto.service:auto-service:1.0.1'
//一般结合JavaPoet框架来生成Java代码,这里不对它进行阐述。
//implementation 'com.squareup:javapoet:1.13.0'
implementation 'com.google.auto.service:auto-service-annotations:1.0.1'
2、写接口
package com.example.apmdemo2.autoservice;
​
public interface IFly {
    String fly();
}
3、写实现
@AutoService(IFly.class)
public class Bird implements IFly{
    @Override
    public String fly() {
        return "Bird fly";
    }
} 
​
​
@AutoService(IFly.class)
public class Plane implements IFly{
    @Override
    public String fly() {
        return "Plane fly";
    }
}
​

4、调用

public class AutoServiceTest {
    public static void main(String[] args) {
        ServiceLoader<IFly> loader = ServiceLoader.load(IFly.class);
        for (IFly iFly:loader){
            System.out.println(iFly.fly());
        }
    }
}