serviceloader.load 构造参数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
serviceloader.load 构造参数
ServiceLoader.load() 方法是 Java 中用于加载指定服务类型( Service Type )的函数,该函数在 Java 6 中被引入。
该方法通过读取配置文件( META-INF/services 对应服务类型的全限定名)来实现加载对应的服务实现类( Provider )。
该方法可以存储一组服务实现类,并能够搜索该组服务的实现类供使用者使用。
下面我们来详细介绍一下 ServiceLoader.load() 方法的构造参数中文说明。
1、service:
// 加载服务类型为 IService 的所有实现类
ServiceLoader<IService> serviceLoader = ServiceLoader.load(IService.class);
此时,ServiceLoader 将根据 META-INF/services/IService 配置文件中指定的服务
实现类( Provider )进行加载。
2、loader:
该参数是用来指定 ClassLoader,表示加载时使用的类加载器。
注意:该参数并不影
响应用程序主线程的类加载器。
常见用法为利用传入的类加载器寻找相关的 service 配置文件,以及相关的实现类。
处理完成配置文件和实现类的加载之后,构造一个实现的线程上下文类加载器,并把它作
为返回对象的上下文类加载器属性。
如果 loader 为 null,则使用默认的系统类加载器( SystemClassLoader ) 来加载服务实现类。
3、provider:
该参数是用来指定服务提供者抽象类。
默认情况下,该参数将被转换为使用其全限定
程序名作为服务实现类集合的资源文件名称, 这些资源文件应该具有以下格式:使用一个或多个空格或制表符分隔的每一行,第一行是服务实现类的全限定名。
强烈建议实现类以单例形式存在 - 否则很快就会因多次调用创建相同类型对象的构
造函数而降低效率。
如果该参数为 null,则尝试使用默认的实现
( sun.misc.Service )。
4、<S> Iterable<S> providers:
该参数是用于替代默认的服务提供者 ( Provider )。
如果传递了这个参数,那么传入的迭代器将用于提供 Provider 实现。
传入的 iterator 可以是普通集合迭代器,也可以是延迟到服务加载时返回的迭代器。
如果输入的迭代器是 null,该方法的行为就与不输入这个参数时的行为一致。
5、使用模板模式
当服务类型需要多次加载时,可以使用模板模式将抽象类和服务类分离出来,然后动态地付诸每个服务类。
该方式非常实用,在此不再详细讨论。
小结:。