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/ 目录里同时创建一个以服务接口命名的该服务接口具体实现类文件
-
文件中将接口实现写上
-
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());
}
}
}