使用Java的java.util.ServiceLoader实现服务发现和加载

459 篇文章 ¥29.90 ¥99.00
本文详细介绍了如何使用Java的`java.util.ServiceLoader`进行服务发现和加载。通过定义服务接口,创建服务提供者,并在`META-INF/services`目录下配置,可以在运行时动态加载并使用这些服务。示例代码展示了如何加载并调用`MessageService`接口的实现,展示了一个灵活且可扩展的架构设计方法。

在Java编程中,有时候我们需要动态地加载和使用外部提供的服务。Java标准库中的java.util.ServiceLoader类提供了一种简单而强大的机制来实现服务发现和加载。它允许我们定义服务接口,然后在运行时从类路径中动态加载实现这些接口的服务提供者。本文将介绍如何使用java.util.ServiceLoader来实现服务发现和加载。

  1. 定义服务接口
    首先,我们需要定义一个服务接口,该接口将由不同的服务提供者实现。假设我们要定义一个名为"MessageService"的服务接口,它包含一个用于发送消息的方法。
public interface MessageService {
   
   
    void sendMessage(String message);
SLF4J(E): Failed to instantiate SLF4J LoggerFactory SLF4J(E): Reported exception: java.lang.SecurityException: Invalid signature file digest for Manifest main attributes at java.base/sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:340) at java.base/sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:282) at java.base/java.util.jar.JarVerifier.processEntry(JarVerifier.java:323) at java.base/java.util.jar.JarVerifier.update(JarVerifier.java:235) at java.base/java.util.jar.JarFile.initializeVerifier(JarFile.java:761) at java.base/java.util.jar.JarFile.getInputStream(JarFile.java:859) at java.base/sun.net.www.protocol.jar.JarURLConnection.getInputStream(JarURLConnection.java:166) at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.parse(ServiceLoader.java:1172) at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(ServiceLoader.java:1213) at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1228) at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1273) at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1309) at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1393) at org.slf4j.LoggerFactory.findServiceProviders(LoggerFactory.java:133) at org.slf4j.LoggerFactory.bind(LoggerFactory.java:195) at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:187) at org.slf4j.LoggerFactory.getProvider(LoggerFactory.java:511) at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:497) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:446) at org.apache.commons.logging.LogAdapter$Slf4jAdapter.createLocationAwareLog(LogAdapter.java:121) at org.apache.commons.logging.LogAdapter.createLog(LogAdapter.java:95) at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:67) at org.apache.commons.logging.LogFactory.getLog(LogFacto
09-25
Exception in thread "DubboSaveMetadataReport-thread-1" java.lang.NoClassDefFoundError: com/alibaba/fastjson/JSONException at java.base/java.lang.Class.getDeclaredConstructors0(Native Method) at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:2985) at java.base/java.lang.Class.getConstructor0(Class.java:3180) at java.base/java.lang.Class.getConstructor(Class.java:2199) at java.base/java.util.ServiceLoader.getConstructor(ServiceLoader.java:623) at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1111) at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1142) at java.base/java.util.ServiceLoader$1.hasNext(ServiceLoader.java:1164) at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1246) at org.apache.dubbo.common.utils.JsonUtils.loadExtensions(JsonUtils.java:81) at org.apache.dubbo.common.utils.JsonUtils.createJsonUtil(JsonUtils.java:52) at org.apache.dubbo.common.utils.JsonUtils.getJson(JsonUtils.java:40) at org.apache.dubbo.common.utils.JsonUtils.toJson(JsonUtils.java:114) at org.apache.dubbo.metadata.report.support.AbstractMetadataReport.storeConsumerMetadataTask(AbstractMetadataReport.java:356) at org.apache.dubbo.metadata.report.support.AbstractMetadataReport.lambda$storeConsumerMetadata$3(AbstractMetadataReport.java:342) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614) at java.base/java.lang.Thread.run(Thread.java:1474) Caused by: java.lang.ClassNotFoundException: com.alibaba.fastjson.JSONException at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:580) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:490) ... 18 more
最新发布
11-29
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值