Service Provider Iterface (SPI) 和 sun.misc.Service
程序员文章站
2022-07-15 14:43:05
...
温故而知新,一年前写过一篇此内容的文章,貌似已经遗失。
一个服务(service)通常指的是已知的接口或者抽象类,服务提供方就是对这个接口或者抽象类的实现,然后按spi标准存放到资源路径META-INF/services目录下,文件的命名为该服务接口的全限定名。
如果一个接口com.github.yingzhuo.api.SomeService其实现类为com.github.yingzhuo.spi.SomeServiceProvider,
那此时需要在META-INF/services中放置文件com.github.yingzhuo.api.SomeService,其中的内容就为该实现类的全限定名com.github.yingzhuo.spi.SomeServiceProvider,
有多个服务实现,每一行写一个服务实现,#后面的内容为注释,并且该文件只能够是以UTF-8编码。
接口
顶层工厂类
实现类
一个服务(service)通常指的是已知的接口或者抽象类,服务提供方就是对这个接口或者抽象类的实现,然后按spi标准存放到资源路径META-INF/services目录下,文件的命名为该服务接口的全限定名。
如果一个接口com.github.yingzhuo.api.SomeService其实现类为com.github.yingzhuo.spi.SomeServiceProvider,
那此时需要在META-INF/services中放置文件com.github.yingzhuo.api.SomeService,其中的内容就为该实现类的全限定名com.github.yingzhuo.spi.SomeServiceProvider,
有多个服务实现,每一行写一个服务实现,#后面的内容为注释,并且该文件只能够是以UTF-8编码。
接口
package com.github.yingzhuo.api; public interface SomeService { public String getMessage(); }
顶层工厂类
package com.github.yingzhuo.api; import java.util.Iterator; import sun.misc.Service; @SuppressWarnings("rawtypes") public class SomeServiceFactory { private SomeServiceFactory() { } public static SomeService getSomeServiceInstance() { Iterator it = Service.providers(SomeService.class); if (it.hasNext()) { return (SomeService) it.next(); } else { return null; } } }
实现类
package com.github.yingzhuo.spi; import com.github.yingzhuo.api.SomeService; public class SomeServiceProvider implements SomeService { public String getMessage() { return getClass().getName(); } }
推荐阅读
-
Service Provider Iterface (SPI) 和 sun.misc.Service
-
Service Provider Iterface (SPI) 和 sun.misc.Service
-
集成Nacos1.2.1和Dubbo2.7.6 消费者报错No provider available for the service xxx
-
laravel5如何创建service provider和facade
-
laravel5创建service provider和facade的方法详解
-
IOC Container的工作机制和理解container 和Service Provider
-
laravel5创建service provider和facade的方法详解
-
laravel5如何创建service provider和facade