「spi实例java」spi实现
本篇文章给大家谈谈spi实例java,以及spi实现对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、java spidevice 在什么类里
- 2、SPI用法简介
- 3、为什么说SPI打破双亲委派机制
- 4、请问一个关于java中的spit的用法
- 5、基于spring factories机制开发SDK
java spidevice 在什么类里
java spi的具体约定为:当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。 基于这样一个约定就能很好的找到服务接口的实现类,而不需要再代码里制定。jdk提供服务实现查找的一个工具类:java.util.ServiceLoader
SPI用法简介
spi是Service Provider Interface的缩写。使用spi技术可以通过修改配置的方式,更换程序中某个接口的实现类,从而改变程序行为。spi的用法如下:
建立文件META-INF\services\com.foo.bar.service.FooService,写入下面两行:
编辑文件META-INF/services/java.sql.Driver,加入所需要的驱动类。
参考资料
为什么说SPI打破双亲委派机制
java类通过Classloader加载,系统默认的3个Classloader之间有引用关系,AppClassLoader的parent属性引用了ExtClassloader,ExtClassloader的parent为null,代表引用了BootstrapClassloader。在类加载时,子加载器会调用父加载器来加载类,如果父加载器不能加载类,才会交给子加载器来加载;如果子加载器也加载失败,那么就报异常。
可以看出双亲委派机制是一种至下而上的加载方式,那么SPI是如何打破这种关系?
以JDBC加载驱动为例:
在JDBC4.0之后支持SPI方式加载java.sql.Driver的实现类。SPI实现方式为,通过ServiceLoader.load(Driver.class)方法,去各自实现Driver接口的lib的META-INF/services/java.sql.Driver文件里找到实现类的名字,通过Thread.currentThread().getContextClassLoader()类加载器加载实现类并返回实例。
先看下如果不用Thread.currentThread().getContextClassLoader()加载器加载,整个流程会怎么样。
请问一个关于java中的spit的用法
str[0]="";
如果你要判断的话用这个式子保险
if(str[0] != null str[0].length() != 0){
;}
在eclipse里面试一下啊,有debug选项在spit后面设置断点,然后进入debug,到变量空间里面看看即可!
基于spring factories机制开发SDK
SPI机制:为某个接口寻找服务实现的机制
java SPI就是提供这样的一个机制 ,需要在META-INF目录中设置接口的实现,以实现服务接口与实现的解耦。第三方服务厂商或者插件服务,可以依据SPI机制,实现功能扩展。
在Spring中也有一种类似与Java SPI的加载机制。它在META-INF/spring.factories文件中配置接口的实现类,我们成为Spring factories机制,基于此我们可以自定义stater或SDK供他人使用,项目只在pom.xml中引入SDK,无须配置即可实现功能集成。
最近的需求为例,需要实现授权功能SDK,以供其他产品使用
项目目录结构如下
第一步:在包名root目录下创建自动配置类 EsbrSdkAutoConfig
内容如下:添加
@Configuration
@ComponentScan(basePackageClasses = EsbrSdkAutoConfig.class)
标识此类为配置类,并配置扫描路径为当前类
第二步; 在resources/META-IN目录下,创建spring.factories文件
内容如下:
将org.springframework.boot.autoconfigure.EnableAutoConfiguration的自动配置为值设置为第一步的EsbrSdkAutoConfig的全限定类名(包名+类名)
第三步:编写SDK的Service
通过以上三步,即可基于Spring factories机制完成自定义Starter,在其他项目pom.xml中引入该starter即可
是不是很简单,下面讲解下原理
spring-core包里定义了SpringFactoriesLoader类,这个类实现了检索META-INF/spring.factories文件中的配置,
并通过 loadFactoryNames方法() 获取其接口类的名称
在这个方法中会遍历整个ClassLoader中所有jar包下的spring.factories文件。也就是说我们可以在自己的jar中配置spring.factories文件,不会影响到其它地方的配置,也不会被别人的配置覆盖。
将org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.org.bjca.esbr.sdk.EsbrSdkAutoConfig
基于springboot自动配置,会扫描并初始化EsbrSdkAutoConfig类,并将EsbrSdkAutoConfig作为basepackage,扫描改类及其该类子包下的类,加载到spring容器。
关于spi实例java和spi实现的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-16,除非注明,否则均为
原创文章,转载请注明出处。