Apache Commons Discovery 与面向服务编程

本文介绍如何使用Apache Commons Discovery工具包实现接口与其实现的分离,并通过配置文件或JAR的META-INF/services目录定义接口与实现之间的映射关系。此外,还展示了如何使用cglib对返回的实现类进行增强。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用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 发表评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值