Java 9:ServiceLoader
java.util.ServiceLoader类在运行时加载服务提供者/实现。 在编译时,ServiceLoader只需要知道Service接口。 借助Java9模块化,我们可以在运行时动态添加服务实现模块,而Application可以拥有新的实现,而不会影响任何事情,
让我们以示例进行检查,并使用EventService.java接口创建模块EventsAPI
EventsAPI / EventService.java
package events.api;public interface EventService {public String getName();
}
EventsAPI /模块信息.java
module events.api {exports events.api;
}
在另一个名为FacebookEvents的模块中为EventService接口创建一个实现
FacebookEvents / FacebookEventService.java
package events.api.facebook;
import events.api.EventService;public class FacebookEventService implements EventService{public FacebookEventService() {System.out.println("FacebookEventService Constructor");}public String getName() {return "facebook events";}
}
FacebookEvents / module-info.java
module events.api.facebook {requires events.api;provides events.api.EventServicewith events.api.facebook.FacebookEventService;
}
FacebookEvents模块需要EventsAPI,因为它需要有权访问EventService.java接口。
并且它通过 FacebookEventService 提供 EventService实现。
让我们创建一个客户端模块EventsClient以使用EventsAPI
EventsClient / module-info.java
module client.calendar {
requires events.api;
uses events.api.EventService;
}
我们将使用ServiceLoader查找EventService接口的实现,此处ServiceLoader需要在EventService上使用uses关键字,否则编译器将引发错误。
最终客户测试课程
EventsClient / Calendar.java
package client.calendar;
import java.util.ServiceLoader;
import events.api.EventService;public class Calendar {
public static void main(String[] args) {
System.out.println("Calendar events..!!!");
ServiceLoader<EventService> events = ServiceLoader.load(EventService.class);for(EventService event : events) {
System.out.println(event.hashCode() + " : " +event.getName());
}
events.reload();
for(EventService event : events) {
System.out.println(event.hashCode() + " : " +event.getName());
}
}
}
在EventsClient模块中,我们没有提及任何有关FacebookEvents模块的信息,而在运行上述Calendar.java add FacebookEvents模块时,输出为
输出
Calendar events..!!!
FacebookEventService Constructor
1627960023 : facebook events
FacebookEventService Constructor
745160567 : facebook events
ServiceLoader找到了EventService实现FacebookEventService并显示了输出,让我们向EventService接口添加另一个实现并检查上述客户端的输出
TwitterEvents / module-info.java
module events.api.twitter {
requires events.api;
provides events.api.EventService
with events.api.twitter.TwitterEventService;
}
与FacebookEventService相同,将具有TwitterEventService,它将实现EventService接口
TwitterEvents / TwitterEventService.java
package events.api.twitter;import events.api.EventService;public class TwitterEventService implements EventService{public TwitterEventService() {
System.out.println("TwitterEventService Constructor");
}public String getName() {
return "twitter events";
}
}
通过在模块路径上添加TwitterEvents模块来运行EventsClient / Calendar.java ,输出如下
日历活动.. !!!
TwitterEventService Constructor
249515771 : twitter events
FacebookEventService Constructor
1627960023 : facebook events
TwitterEventService Constructor
321142942 : twitter events
FacebookEventService Constructor
745160567 : facebook events
我们刚刚在运行时添加了TwitterEvents模块,ServiceLoader能够加载TwitterEventService并提供所需的输出。
源代码位于https://github.com/rameshcharykotha/java9practice
谢谢阅读..!!
翻译自: https://www.javacodegeeks.com/2017/10/java-9-serviceloader.html
Java 9:ServiceLoader相关推荐
- java 终极超类,Java问答:终极父类(3),java问答
Java问答:终极父类(3),java问答Java问答:终极父类(上) Java问答:终极父类(下) Java问答:终极父类(2)-上篇 Java问答:终极父类(2)-下篇 在之前关于 Object ...
- public接口可以被任何一个类实现_一文带你深入Java核心技术:对象克隆+接口与回调,还有这种操作...
对象克隆 当拷贝一个变量时,原始变量与拷贝变量引用同一个对象,如图6-1所示.这就是说,改变一个变量所引用的对象将会对另一个变量产生影响. Employee original = new Employ ...
- 清华学霸花了三年时间对java理解: Java分布式架构
什么是分布式架构 分布式系统(distributed system)是建立在网络之上的软件系统. 内聚性是指每一个数据库分布节点高度自治,有本地的数据库管理系统. 透明性是指每一个数据库分布节点对用户 ...
- Java线程:线程的调度-合并
Java线程:线程的调度-合并 线程的合并的含义就是将几个并行线程的线程合并为一个单线程执行,应用场景是当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法. join为非静态方法,定义 ...
- Java项目: 基于SSM实现教务管理系统
系统编号:BS-GX-020 后台技术:Spring+Springmvvc+mybatis+shiro 前端技术:Bootstrap+jquery+ajax 页面开发:JSP 开发工具:IDEA 或 ...
- Java线程:新特征-条件变量(转)
条件变量是Java5线程中很重要的一个概念,顾名思义,条件变量就是表示条件的一种变量.但是必须说明,这里的条件是没有实际含义的,仅仅是个标记而已,并且条件的含义往往通过代码来赋予其含义. 这里的条件和 ...
- Java Hashmap:如何从价值中获取关键?
如果我的值是"foo" ,并且ftw.containsValue("foo")返回true的HashMap<String> ftw ,如何获得相应的 ...
- Java笔记:成员变量,局部变量,类变量,实例变量以及注意事项
局部变量:方法中定义的变量. 成员变量(类似C中的全局变量):成员变量定义在方法体和语句块之外.成员变量就概括描述了类中的变量,不区分static.是以下变量的统称. 类变量(静态变量):独立于方法之 ...
- 死磕Java并发:J.U.C之阻塞队列:ArrayBlockingQueue
作者:chenssy 来源:Java技术驿站 ArrayBlockingQueue,一个由数组实现的有界阻塞队列.该队列采用FIFO的原则对元素进行排序添加的. ArrayBlockingQueue为 ...
最新文章
- linux搭建--ubuntu使用qemu-kvm,libvirt搭建虚拟机,并搭建libvmi来虚拟机自省(三)
- 动态规划之状态机模型
- Mask R-CNN详解和安装
- java 构造 super_Java中的构造方法this、super的用法详解
- sftp 安全文件传输
- 客户端连接openfire报错解决
- python工资这么高为什么不学-为什么Python岗位薪资越来越高
- linux buffer 刷到磁盘,Linux下的磁盘缓存 linux page buffer cache深入理解
- golang mysql scan_在Golang中对MySQL进行操作
- 关于python注释下面选项描述错误的是_关于Python的列表,以下选项中描述错误的是______...
- 搭建 MongoDB 服务器,MongoDB 基本使用,数据导入导出
- 伍斯特理工学院计算机,世界排名领先,伍斯特理工学院到底有多厉害?
- 学的计算机专业不会编程,学计算机专业的不会编程啊怎么办?
- Halcon 第二章『图像滤波』◆第5节:texture_laws算子(纹理过滤器)的计算原理
- 4.2.4 图像色调处理
- mysql memory leak,项目在Tomcat中启动出现内存泄露memory leak
- 『贪心』阿狸和桃子的游戏
- 误删c盘user文件夹后,如何恢复文件
- GitHub-demo:Image-Stitching
- 江苏省盐城中学信息竞赛队(YZOI)队规