`
amang
  • 浏览: 30513 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Apache Commons Discovery 与面向服务编程

阅读更多

使用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

jamax 2007-03-29 20:05 发表评论
分享到:
评论

相关推荐

    Apache Commons Discovery入门

    10. **集成实践**:在实际项目中,Apache Commons Discovery可以与其他开源项目(如Spring Boot、Eureka等)集成,以增强服务发现的功能。例如,在微服务架构中,Discovery可以帮助找到其他微服务实例。 总之,...

    apache-commons-id.jar和commons-discovery-0.2.jar

    例如,当一个服务需要动态地寻找并连接到其他服务时,Apache Commons ID 可以生成服务实例的唯一标识,而Commons Discovery 则可以帮助找到这些服务。这在微服务架构或者SOA(Service-Oriented Architecture)中尤其...

    使用Apache Commons Discovery查找可插拔接口实现类(Pluggable interfaces)

    4. **`PropertiesUtil` 类**:这个工具类用于处理属性文件,可以用来读取和写入与服务相关的元数据。 5. **服务注册**:你可以使用 `ServiceDiscovery.addService(Class, T)` 方法将服务添加到发现机制中。这需要一...

    commons-discovery-0.2.jar

    commons-discovery-0.2.jar

    commons-discovery.rar

    Apache Commons Discovery是Apache软件基金会开发的一个Java库,主要用于在Java应用程序中发现服务和资源。这个库的核心功能是在运行时定位和加载JAR文件中的服务,这些服务可能通过标准的Java服务提供者接口(SPI)...

    commons-discovery-0.4

    Apache Commons Discovery是Apache软件基金会开发的一个Java库,主要用于在运行时发现JAR文件中的服务和API。这个库的核心功能在于帮助应用程序找到并使用其他服务,如JMX(Java Management Extensions)、JAF(Java...

    org.apache.commons jar

    Apache Commons 是一个由 Apache 软件基金会维护的开源项目,它提供了大量的 Java 类库,以帮助开发者解决常见的编程任务。这些类库弥补了 Java 核心库中的不足,为开发人员提供了更方便、功能更丰富的工具。"org....

    commons-discovery-0.5.jar

    4. **JMX**: Apache Commons Discovery与JMX的集成允许开发者在运行时发现和管理MBean。它提供了创建、注册和发现MBean的工具。 5. **Naming**: 项目提供了基于JNDI(Java Naming and Directory Interface)的服务...

    commons-discovery-0.2.jar.zip

    在实际开发中,Apache Commons Discovery通常与其他Apache Commons库如Commons Logging、Commons Lang等结合使用,以增强服务发现和管理的能力。同时,由于其与J2EE规范的良好集成,它在企业级应用开发中特别有用,...

    apache commons all 中文api合集

    apache commons all 中文api合集

    apache.commons全套jar包下载

    Apache Commons 是一个由 Apache 软件基金会维护的开源项目,它提供了大量Java类库,以帮助开发者处理常见的编程任务。这些类库弥补了Java标准库中的不足,为开发人员提供了一套强大且实用的工具。在本压缩包中,您...

    Apache Commons工具集

    1. **IO**: Apache Commons IO 提供了大量与输入/输出流相关的辅助类,如文件操作、流处理、字符编码转换等。例如,`FileUtils` 类提供了方便的文件操作方法,如复制、移动、删除文件;`IOUtils` 可以用于读写流并...

    org.apache.commons.lang jar包下载(commons-lang3-3.1.jar)

    commons-lang3.3.1.jar、Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。为JRE5.0+的更好的版本所提供 Jar文件包含的类: META-INF/MANIFEST.MFMETA-INF/LICENSE....

    Apache Commons组件简介.ppt

    9. **Proxy**:Apache Commons Proxy 提供了动态代理的实现,使得在运行时创建和管理代理对象变得容易,这对于实现AOP(面向切面编程)或者动态服务代理等场景非常有帮助。 10. **Chain**:Apache Commons Chain ...

    apache Commons Lang 2.4 API

    apache Commons Lang 2.4 API apache Commons Lang 2.4 API

    org.apache.commons.lang jar包下载

    commons-lang3.3.1.jar、Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。为JRE5.0+的更好的版本所提供 Jar文件包含的类: META-INF/MANIFEST.MFMETA-INF/LICENSE....

    Apache Commons NET 3.0

    Apache Commons Net 3.0的发布是为了提供稳定、可靠的网络编程接口,简化开发过程,并且兼容多种Java平台。它通过良好的文档和示例代码,降低了学习和使用的难度,使得开发者可以更专注于应用逻辑,而不是底层网络...

    apache commons jar(commons所有的jar包,从官网下载提供.zip

    apache commons jar(commons所有的jar包,从官网下载提供给大家) 因为涉及jar太多,包括有src源代码,只需要3分,希望大家理解,我也是从官网花了很长时间才一个一个下完,需要的请自取。全部是zip文件,每个对应的...

    Apache Commons FileUpload 1.3.2 released

    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 Math3探索之多项式曲线拟合实现代码

    Apache Commons Math3是一个强大的Java库,它提供了许多数学和统计工具,包括多项式曲线拟合功能。在本文中,我们将深入探讨如何使用Apache Commons Math3库进行多项式曲线拟合。 首先,我们要知道多项式曲线拟合是...

Global site tag (gtag.js) - Google Analytics