当前位置: 首页 > news >正文

通过Interface扫描获取所有其实现类

        当我们在代码中定义了一个接口,很多功能累实现了这个接口。所以我们可以统一管理这个接口,避免自己手动创建对象。避免在后续的新功能假如是实现时修改过多的代码,而导致意外出现。

        ClassPathScanningCandidateComponentProvider提供了一个从指定包中扫面接口实现类的功能。

ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
provider.addIncludeFilter(new AssignableTypeFilter(BaseHandler.class));
Set<BeanDefinition> definitionSet = provider.findCandidateComponents("com.test.xxxx.handler");
for (BeanDefinition beanDefinition : definitionSet) {Class<?> clazz = Class.forName(beanDefinition.getBeanClassName());LOGGER.info("初始化数据同步处理service:{}", beanDefinition.getBeanClassName());BaseHandler handler= (BaseHandler) clazz.newInstance();//其他的业务逻辑,可以用map统一管理//例如接口中加如一个方法,强制实现类实现,并给出自己的唯一IdHandlerDto handlerDto = service.getUnique();}

这样我们就可以获取到所有的实现类并在需要的时候,传入参数获取其对象。

完整实现测试如下:

接口:

public interface BaseHandler {/*** 获取处理器的唯一编码  */DataHandlerDto getUnique();/*** 业务实现逻辑*/void dealData(Object obj);
}

统一管理和获取实现对象

@Component
public class HnadlerManager {public static final Map<HandlerDto, Class< ? extends BaseHandler>> HANDLER_SERVICE_MAP = new HashMap<>();@PostConstructprivate static void initOperateService(){LOGGER.info("初始化数据同步处理handler");registerCollect();}private static void registerCollect(){ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);provider.addIncludeFilter(new AssignableTypeFilter(BaseHandler.class));Set<BeanDefinition> definitionSet = provider.findCandidateComponents("com.eshore.cnomp.handler");try {for (BeanDefinition beanDefinition : definitionSet) {Class<?> clazz = Class.forName(beanDefinition.getBeanClassName());LOGGER.info("初始化数据同步处理service:{}", beanDefinition.getBeanClassName());BaseHandler service = (BaseHandler) clazz.newInstance();HandlerDto handlerDto = service.getUnique();boolean iscontain = false;for(Map.Entry<HandlerDto,Class< ? extends BaseHandler>> entry: HANDLER_SERVICE_MAP.entrySet()){HandlerDto dto = entry.getKey();if(dto.getId.equals(handlerDto.getId())){iscontain = true;LOGGER.info("已存在相同数据同步处理类:{}, {}",entry.getValue().getName(), JSON.toJSONString(dto));}}if(!iscontain){HANDLER_SERVICE_MAP.put(HandlerDto, service.getClass());}}}catch (Exception e){LOGGER.error("初始化数据同步处理service失败", e);throw new RuntimeException("初始化数据同步处理service失败");}}public static BaseHandler getHandler(String id){for(Map.Entry<HandlerDto,Class< ? extends BaseHandler>> entry: HANDLER_SERVICE_MAP.entrySet()){HandlerDto dto = entry.getKey();if(dto.getId.equals(id)){Class<? extends BaseHandler> clazz = entry.getValue();try {return clazz.newInstance();} catch (Exception e) {LOGGER.error("构建采集兑现失败", e);return null;}}}return null;}}

以上实现是单个兑现的实现。如果需要以链路的方式,即同一个对象可以被多个处理器顺序处理,则需要调整其存储的方式为list并加入排序。

http://www.dtcms.com/a/367204.html

相关文章:

  • AI 浪潮下阿里云“高光”乍现,但离终局胜利尚远
  • MySQL主从复制进阶(GTID复制,半同步复制)
  • 搭建基于 Solon AI 的 Streamable MCP 服务并部署至阿里云百炼
  • 鸿蒙NEXT动画开发指南:组件与页面典型动画场景解析
  • ios按键精灵提示 “设备信息丢失”如何处理?
  • 在Ant Design Vue 中使用图片预览的插件
  • Elixir通过Onvif协议控制IP摄像机,扩展ExOnvif的摄像头停止移动 Stop 功能
  • 【RNN-LSTM-GRU】第五篇 序列模型实战指南:从选型到优化与前沿探索
  • 对于数据结构:链表的超详细保姆级解析
  • 从0到1搭建某铝箔智慧工厂网络:5G与WiFi 6助力智能制造
  • 2025年财会领域专业资格认证选择指南
  • AR眼镜在智能制造的应用方向和场景用例|阿法龙XR云平台
  • BERT家族进化史:从BERT到LLaMA,每一次飞跃都源于对“学习”的更深理解
  • 【深度学习】P1 引言:深度学习的万家灯火
  • 网络安全初级-渗透测试
  • 下载apache-maven-3.6.1版本并配置maven镜像及本地仓库[超简单]
  • Hunyuan-MT-7B模型介绍
  • 告别低效广告!亚马逊关键词筛选全流程攻略
  • matlab版本粒子群算法(PSO)在路径规划中的应用
  • ultralytics/nn/tasks.py源码学习笔记——核心函数parse_model
  • 【正整数的最优分解2的次方和形式非0次方】2022-11-1
  • Java基础知识点汇总(五)
  • 什么是压力测试,有哪些方法
  • AI入坑: Trae 通过http调用.net 开发的 mcp server
  • IIS服务器下做浏览器缓存
  • 小白学OpenCV系列3-图像算数运算
  • jQuery 入门:一份献给初学者的完全指南
  • 怎么做到这一点:让 Agent 可以像人类一样 边听边想、边说,而不是“等一句话 → 一次性返回”
  • 风险慎投!IF 狂跌10分,国人发文超80%,这本SCI的1区TOP还能撑多久?
  • 剧本杀APP系统开发:引领娱乐行业新潮流的科技力量