使用Apache Commons 的 Discovery 工具包可以实现接口和实现的分离,包括JAR SPI规范的简单实现。结合面向接口的编程方法,可以实现一个简单的面向服务的调用方式。
//初始化
ClassLoaders loaders =
ClassLoaders.getAppLoaders(serviceClass, serviceClass.getClass(), false);
DiscoverClass discover = new DiscoverClass(loaders);
// 使用newInstance方式直接产生接口实现的实例
implInstance = (PublicService) discover.newInstance(serviceClass, defaultImpl);
// 也可以使用find的方式返回对应的实现类
implClass = discover.find(serviceClass, configFile, defaultImpl);
上面的用法中,接口和实现类的映射关系在一个properties配置文件中定义,格式是:
XXXable=XXXimpl
也可以在classpath中的jar的META-INF/services中定义,格式是:
META-INF/services/xxxable(文件) 文件内容为 xxximpl
以下事完整程序中使用了cglib的 net.sf.cglib.proxy.Enhancer 对返回的实现类进行了增强,可以实现一个简单的面向方面的程序结构:
public class ServiceFinder {
private static final String configFile = "services.properties";
private static Enhancer enhancer = new Enhancer();
private ServiceFinder() {
}
public static PublicService lookup(Class serviceClass) {
return lookup(serviceClass, null);
}
public static PublicService lookup(Class serviceClass, String defaultImpl) {
// 创建一个类装入器的实例
ClassLoaders loaders =
ClassLoaders.getAppLoaders(serviceClass, serviceClass.getClass(), false);
DiscoverClass discover = new DiscoverClass(loaders);
PublicService impl = null;
try {
Class implClass = null;
// 用DiscoverClass的实例来查找实现类
if (defaultImpl == null || "".equals(defaultImpl)) {
implClass = discover.find(serviceClass, PropertiyFile.load(configFile));
} else {
implClass = discover.find(serviceClass, configFile, defaultImpl);
}
enhancer.setSuperclass(implClass);
enhancer.setCallback(new ServiceInterceptor(implClass.toString()));
impl = (PublicService) enhancer.create();
// using DiscoverClass instance lookup the impelement
//impl = (PublicService) discover.newInstance(serviceClass, defaultImpl);
} catch (Exception ex) {
ex.printStackTrace();
throw new IllegalArgumentException("无法获取指定的服务项");
}
return impl;
}
<!---->Technorati
: Apache Discovery
分享到:
相关推荐
10. **集成实践**:在实际项目中,Apache Commons Discovery可以与其他开源项目(如Spring Boot、Eureka等)集成,以增强服务发现的功能。例如,在微服务架构中,Discovery可以帮助找到其他微服务实例。 总之,...
例如,当一个服务需要动态地寻找并连接到其他服务时,Apache Commons ID 可以生成服务实例的唯一标识,而Commons Discovery 则可以帮助找到这些服务。这在微服务架构或者SOA(Service-Oriented Architecture)中尤其...
4. **`PropertiesUtil` 类**:这个工具类用于处理属性文件,可以用来读取和写入与服务相关的元数据。 5. **服务注册**:你可以使用 `ServiceDiscovery.addService(Class, T)` 方法将服务添加到发现机制中。这需要一...
commons-discovery-0.2.jar
Apache Commons Discovery是Apache软件基金会开发的一个Java库,主要用于在Java应用程序中发现服务和资源。这个库的核心功能是在运行时定位和加载JAR文件中的服务,这些服务可能通过标准的Java服务提供者接口(SPI)...
Apache Commons Discovery是Apache软件基金会开发的一个Java库,主要用于在运行时发现JAR文件中的服务和API。这个库的核心功能在于帮助应用程序找到并使用其他服务,如JMX(Java Management Extensions)、JAF(Java...
Apache Commons 是一个由 Apache 软件基金会维护的开源项目,它提供了大量的 Java 类库,以帮助开发者解决常见的编程任务。这些类库弥补了 Java 核心库中的不足,为开发人员提供了更方便、功能更丰富的工具。"org....
4. **JMX**: Apache Commons Discovery与JMX的集成允许开发者在运行时发现和管理MBean。它提供了创建、注册和发现MBean的工具。 5. **Naming**: 项目提供了基于JNDI(Java Naming and Directory Interface)的服务...
在实际开发中,Apache Commons Discovery通常与其他Apache Commons库如Commons Logging、Commons Lang等结合使用,以增强服务发现和管理的能力。同时,由于其与J2EE规范的良好集成,它在企业级应用开发中特别有用,...
Apache Commons 是一个由 Apache 软件基金会维护的开源项目,它提供了大量Java类库,以帮助开发者处理常见的编程任务。这些类库弥补了Java标准库中的不足,为开发人员提供了一套强大且实用的工具。在本压缩包中,您...
apache commons all 中文api合集
1. **IO**: Apache Commons IO 提供了大量与输入/输出流相关的辅助类,如文件操作、流处理、字符编码转换等。例如,`FileUtils` 类提供了方便的文件操作方法,如复制、移动、删除文件;`IOUtils` 可以用于读写流并...
commons-lang3.3.1.jar、Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。为JRE5.0+的更好的版本所提供 Jar文件包含的类: META-INF/MANIFEST.MFMETA-INF/LICENSE....
9. **Proxy**:Apache Commons Proxy 提供了动态代理的实现,使得在运行时创建和管理代理对象变得容易,这对于实现AOP(面向切面编程)或者动态服务代理等场景非常有帮助。 10. **Chain**:Apache Commons Chain ...
commons-lang3.3.1.jar、Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。为JRE5.0+的更好的版本所提供 Jar文件包含的类: META-INF/MANIFEST.MFMETA-INF/LICENSE....
apache commons jar(commons所有的jar包,从官网下载提供给大家) 因为涉及jar太多,包括有src源代码,只需要3分,希望大家理解,我也是从官网花了很长时间才一个一个下完,需要的请自取。全部是zip文件,每个对应的...
Apache Commons Net 3.0的发布是为了提供稳定、可靠的网络编程接口,简化开发过程,并且兼容多种Java平台。它通过良好的文档和示例代码,降低了学习和使用的难度,使得开发者可以更专注于应用逻辑,而不是底层网络...
The Apache Commons team is pleased to announce the release of Apache Commons FileUpload 1.3.2. The Apache Commons FileUpload component provides a simple yet flexible means of adding support for ...
apache commons jar(commons所有的jar包,从官网下载提供给大家) 因为涉及jar太多,包括有src源代码,只需要3分,希望大家理解,我也是从官网花了很长时间才一个一个下完,需要的请自取。全部是zip文件,每个对应的...
Apache Commons Math3是一个强大的Java库,它提供了许多数学和统计工具,包括多项式曲线拟合功能。在本文中,我们将深入探讨如何使用Apache Commons Math3库进行多项式曲线拟合。 首先,我们要知道多项式曲线拟合是...