刚刚研究携程的apollo时发现ServiceLoader是个类似spring的东西,可以指定接口和实现,通过ServiceLoader去载入。
下面是我的一个例子:
package com.example.demo.ctrl;
import java.util.ServiceLoader;
/**
* @author KING
* @date 2018/10/12 21:18
*/
public class SayHelloMain {
public static void main(String[] args) {
ServiceLoader<SayHello> loder = ServiceLoader.load(SayHello.class);
for (SayHello hello : loder) {
System.out.println(hello.getClass());
hello.sayHello();
}
}
}
依赖的SayHello可以在另外一个jar包:test.jar.也可以在本地....在test.jar里有一个接口,两个实现,MyHello和MyHello2.
package com.example.demo.ctrl;
/**
* @author KING
* @date 2018/10/12 21:20
*/
public class MyHello2 implements SayHello {
@Override
public String sayHello() {
String msg = "---MyHello2";
System.out.println(msg);
return msg;
}
}
通过在的META-INF下的services文件夹com.example.demo.ctrl.SayHello的内容
com.example.demo.ctrl.MyHello2
com.example.demo.ctrl.MyHello
文件来指定实现,多个实现的时候使用换行。
如下图:
注意,这个只能是打成jar之后给其他项目用,自己是不可以用自己的。