在 Java SE 下面有一个不太常见的 ServiceLoader 类 , 它实现了java 中 的spi 机制。 所谓spi ( service provider interface) 就是java se 定义了很多 service 比如 logging, xml parser, jdbc . 这些是所谓的标准, 比如 xml parser, Oracle 会在 rt.jar 中提供一个标准的实现,但是第三方provider 可以提供各自的实现, 这样就需要一个机制去找到相应的实现。 我们都知道 IOC 的思想, 比如spring 我们通过XML 配置来指定具体的实现类。
但是在Java SE 中没有IOC, 它又是怎么实现的呢? 答案就在这个ServiceLoader 类的实现中。
这个类只提供了 三个静态方法 :
1, public static <S> ServiceLoader<S> load(Class<S> service, ClassLoader loader); 采用指定的classLoader 去load 相应的service 实现
2, public static <S> ServiceLoader<S> load(Class<S> service); 采用当前线程的context class loader 去load service
3, public static <S> ServiceLoader<S> loadInstalled(Class<S> service); 这个比较特殊只会load JVM 下面 安装了的 serivce 实现。
class loader 会去找 META-INF/services/ serviceName 的 resource, 找到这个文件 里面就是这个 service 相应实现的class 的类全名称。 当然这个class loader 在找这个 文件的时候遵从 class loader 的查找路径的, 一旦找到就 调用 Class.forName(cn, false, loader);
这个ServiceLoader 还是用的很广泛的, 在比如 nio 的 FileSystems 里面;RMIClassLoader; 还有很多都用到它。
另外很多比如XML parser, JAXB 也都是采用类似这种方式 去找相应的 service factory 实现类工程, 然后调用相应的比如 JAXB 类工厂的 createContext 方法去创建 相应的 service
可以看出这个 ServiceLoader 的作用是大大的。
相关推荐
loader in java houtianloader in java houtian
Fragment+Loader实现异步加载
java 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loaderjava 类加载器 class loader
Java Class Loader总结
自己收集的java class loader相关的一些网络资源文档, 希望对大家有所帮助
jar包+使用方式,可以同时load dxf,wrl,obj,3ds等各种模型,从此无需再到处寻找其他loader了
如何在vue-cli中使用css-loader实现css module 【前言】 无论是vue还是react的css模块化解决方案都是依赖loader来实现的 在使用上,vue中用scoped属性实现样式的私有化,利用深度作用选择器/deep来实现样式的去...
不同Boot Loader之间模块移植的实现
Linux下Boot Loader的设计与实现,pdf 文档博客
universal_image_loader实现https加载图片带证书 ,证书格式为BKS,可以不带证书的不认证统统连接进来
php_swoole_loader_php56_nzts_x64.dll php_swoole_loader_php70_nzts_x64.dll php_swoole_loader_php71_nzts_x64.dll php_swoole_loader_php72_nzts_x64.dll php_swoole_loader_php73_nzts_x64.dll
大批量CSV格式数据上传jar包。sqlloader.jar包
swoole-loader.zip
java-properties-loader 用于Java .properties文件加载器。 用法 var messages = require ( '!json!java-properties!./text_en.properties' ) ; 或者: module: { loaders : [ { test : / \. properties $ / ,...
webpack系列之loader及简单的使用,里面对loader的基本概念及简单使用做了介绍
WinKawaks+loader1.60WinKawaks+loader1.60WinKawaks+loader1.60WinKawaks+loader1.60
glslify-loader, web service的glslify加载程序模块 glslify加载程序 glslify 加载器模块用于 web pack 。安装通常,你将希望在 web pack模块的raw-loader 旁边使用它:npm install --save glslify-loader
source-map-loader, 从模块中提取sourceMappingURL注释并将它的提供给 web service 加载器从现有源文件( 从他们的sourceMappingURL ) 中提取源映射。安装npm i -D source-map-loader用法文档:使用加载程序工具 web ...
vue-style-loader, web service的样式加载器模块 这是一个基于风格的加载器插件的。 style-loader 类似,你可以在 css-loader 之后将它的链接到文档,以将CSS作为样式标记动态插入到文档中。 但是,由于它作为依赖项...
swoole_loader56.so、swoole_loader70.so、swoole_loader71.so、swoole_loader72.so、swoole_loader73.so、swoole_loader74.so。 Linux64位(线程安全) swoole_loader56_zts.so、swoole_loader70_zts.so、swoole_...