概述
1.ServiceLoader定义
ServiceLoader是Java API中服务提供者的加载设施,这里的服务是熟知的接口和类(通常是抽象类)的集合,服务提供者是服务的特定实现,提供者中的类实现接口,并子类化在服务本身中定义的子类。
2.ServiceLoader作用
在工程内或者跨工程通信,怎么说呢?直接看例子:
Test01、Test02服务都实现了IMyServiceLoader接口,通过ServiceLoader我们不需要实例化服务就能调用其实现方法
public interface IMyServiceLoader {
String getString();
}
public class Test01 implements IMyServiceLoader{
@Override
public String getString() {
// TODO Auto-generated method stub
return A.msg;
}
}
public class Test02 implements IMyServiceLoader{
@Override
public String getString() {
// TODO Auto-generated method stub
return "test02";
}
}
public static void main(String[] args){
ServiceLoader<IMyServiceLoader> services = ServiceLoader.load(IMyServiceLoader.class);
for(IMyServiceLoader s : services){
System.out.println(s.getString());
}
3.实现步骤
1.如上图所示,创建一个底层接口跟两个实现接口的服务类
2.在META-INF/services下创建一个底层接口全路径名的配置文件
3.配置文件中注册底层接口的实现服务类,其内容如下:
com.sy.serviceloader.Test01
com.sy.serviceloader.Test02
这样,你就可以通过ServiceLoader.load()方法来获取服务提供者,通过服务提供者来调用容器中的具体服务了。
4.ServiceLoader跨工程使用
如果要在另外一个工程调用Test01、Test02该怎么做?这只需要多操作几个步骤:
1. 在之前的基础中上,把Test01.java、Test02.java、IMyServiceLoader.java以及META-INF/services下的配置文件一并打包成一个jar包(如何打包成一个jar?自行百度哟)。然后将jar包导入到需要调用的工程中,这样就可以通过ServiceLoader.load()来调用到Test01、 Test02了。
5.ServiceLoader在组件化开发中的使用
假设有一个登陆组件module_login,里面有多个登陆方法实现:login1(..),.login2(..),login3(..),我们要做到当把module_login当做library引入到app中时可以非显式调用login方法。当然,我们可以通过路由架构实现。除此之外,我们也可以用ServiceLoader来做,简单说下步骤:
1.在module_login中创建底层服务接口LoginServcie跟实现服务Login01、Login02
public interface LoginService {
void login01();
void login02();
}
public class Login01 implements LoginService{
@Override
public void login01() {
// TODO Auto-generated method stub
//login01登陆代码
}
@Override
public void login02() {
// TODO Auto-generated method stub
}
}
public class Login02 implements LoginService{
@Override
public void login01() {
// TODO Auto-generated method stub
}
@Override
public void login02() {
// TODO Auto-generated method stub
//login02登陆代码
}
}
然后在app的META-INF/services中创建服务注册表com.sy.serviceloader,里面将Login01、Login02的路径注册进来。
最后当module_app导入到app中后,可以通过ServiceLoader.load(LoginService.class)得到ServiceLoader<LoginService>来调用对应的登陆实现。
其实,还有其他手段实现组件间解耦,如ContentProvider、ARouter中的IProvider等都可以做到跟上面一样的效果。这些接下来会介绍到。
最近一直在做组件化相关的开发工作,因为在这方面有所欠缺,所以将开发中遇到的问题及解决方案记录于此,也希望能给各位些许帮助。其实要做到真正意义上的解耦还有很多工作要做,相比在做的各位,我相信很多都比我有经验,我也是边摸索变前进,总之,共同进步吧。
最后
以上就是老实月饼为你收集整理的组件化爬坑---组件间解耦之ServiceLoader的全部内容,希望文章能够帮你解决组件化爬坑---组件间解耦之ServiceLoader所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复