我是靠谱客的博主 老实月饼,最近开发中收集的这篇文章主要介绍组件化爬坑---组件间解耦之ServiceLoader,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部