- 官方文档
- 在一次的项目开发中,需要使用的duboo,但是不需要注册中心,同时在消费者端不使用@Reference注解,需要将服务提供者所有的接口封装到一个对象中
实现方式:
使用ReferenceBean进行配置,针对每一个远程服务都去配置一个ReferenceBean,然后将配置好的bean注入到spring中,就可以使用@autowried注入,
贴代码:
@Resource
private ApplicationConfig applicationConfig;
/**
* 将dubbo的所有的远程接口放到set中,在这这个集合中存放着所有的api接口
*
* @return
*/
@Bean
@Order(1)
public Map<String, IService<T>> referenceServices() throws Exception {
//获取common项目中所有接口
System.out.println("扫描包:" + slaveSchedulerConfig.getDubboConfig().getPackageName());
//获取扫描包下所有的接口文件
List<Class<?>> list = ClassUtils.getClasses(slaveSchedulerConfig.getDubboConfig().getPackageName());
System.out.println("获取到文件:" + list.size());
//dubbo远程调用的接口集合API接口的集合
Map<String, IService<T>> services = new HashMap<>();
for (Class<?> name : list) {
//在部署的时候,扫描会将旗下的类也扫到,需要排除
if (name.getName().endsWith("Impl")) {
continue;
}
System.out.println("生成远程调用的接口:" + this.getClass().getSimpleName() + "--<>--" + name);
ReferenceBean<T> bean = new ReferenceBean<>();
bean.setUrl(slaveSchedulerConfig.getDubboConfig().getMasterUrl());
bean.setInterface(name);
bean.setCheck(false);
bean.setValidation("true");
//这里需要配置config,不然会报错
bean.setApplication(applicationConfig);
//实际上每个api接口都继承了IService这个接口
IService<T> o = (IService<T>) bean.getObject();
services.put(name.getName(), o);
}
return services;
}