跨模块服务
如果模块希望提供接口供其他模块调用,需要将接口定义在两个模块共同依赖的第三个模块中,以便双方都能够访问到该接口。然后提供服务的一方需要在自己的模块中提供服务的实现,并通过ServiceFactory暴露出来:
public class PortalServiceFactory implements ServiceFactory {
@Override
public <T> T create(Class<T> aClass) {
if (aClass.isAssignableFrom(PortalDynamicServiceImpl.class)) {
return (T) new PortalDynamicServiceImpl();
}
return null;
}
}
ServiceFactory包含一个create方法,接收请求的服务接口类型然后返回对应的实现。之后您需要将它们定义在模块的入口类中:
public class ModuleDynamic implements Module {
...
@Override
public List<Class<?>> supportedServices() {
ArrayList<Class<?>> list = new ArrayList<>();
list.add(IModulePortalDynamicService.class);
return list;
}
@Override
public ServiceFactory serviceFactory() {
return new PortalServiceFactory();
}
...
}
supportedServices 返回了当前模块支持的服务接口列表,以供其他模块查询;ServiceFactory则暴露了前面的服务实现工厂。当模块加载后,模块的服务将能够被其他模块访问。调用方先通过 Portal 获取到服务的实例:
IModulePortalDynamicService service = Portal.getService(IModulePortalDynamicService.class);
然后通过实例调用接口方法即可。