ServiceLoader的使用

付威     2019-11-24   796   2min  

获得接口的实现类有点困难

在Java中,由于反射的局限性,无法直接获取一个接口的所有实现子类,所以为了能够实现一个接口动态的注入实现的子类对象,需要借助ServiceLoader

简单的Demo使用


public interface IService {
	void doSomeThing();
}

public class DefalutService implements IService{
	@Override
	public void doSomeThing() {
		RzLogger.info("默认服务");
	}
}

public class LogService implements IService {
	@Override
	public void doSomeThing() {
		RzLogger.info("日志服务");
	}
}


public static void main(String[] args) {
		ServiceLoader<IService> loader = ServiceLoader.load(IService.class);
		for (IService service : loader) {
			service.doSomeThing();
		}
	}

如果直接运行,可以发现没有任何结果,需要在META-INF\services创建一个文件xxx.xxx.IService(是接口类的全类名) ,内容是两个子类的全类名:

learnJava.rz08.DefalutService
learnJava.rz08.LogService

再次运行结果:

21:55:48,873  INFO [main] (RzLogger.java:12) - 默认服务
21:55:48,877  INFO [main] (RzLogger.java:12) - 日志服务
(本文完)

作者:付威

博客地址:http://blog.laofu.online

如果觉得对您有帮助,可以下方的RSS订阅,谢谢合作

如有任何知识产权、版权问题或理论错误,还请指正。

本文是付威的网络博客原创,自由转载-非商用-非衍生-保持署名,请遵循:创意共享3.0许可证

交流请加群113249828: 点击加群   或发我邮件 laofu_online@163.com

付威

获得最新的博主文章,请关注上方公众号