有时候,根据业务逻辑的需求,我们想要获取到某个接口的所有实现类。在这里大致介绍两种方式:

1.借助Spring容器实现

Spring作为一个容器,管理着一个项目中所有经过配置的Java类(xml配置文件或Annotation方式)。如果某个接口的所有实现类均被Spring托管了,那么通过Spring就可以很简单的返回这些实现类。

 1 import org.springframework.beans.BeansException;
 2 import org.springframework.context.ApplicationContext;
 3 import org.springframework.context.ApplicationContextAware;
 4 import org.springframework.stereotype.Component;
 5
 6 @Component
 7 public class ServiceLocator implements ApplicationContextAware{
 8     /**
 9      * 用于保存接口实现类名及对应的类
10      */
11     private Map<String, IService> map;
12
13     /**
14      * 获取应用上下文并获取相应的接口实现类
15      * @param applicationContext
16      * @throws BeansException
17      */
18     @Override
19     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
20         //根据接口类型返回相应的所有bean
21         Map<String, IService> map = applicationContext.getBeansOfType(IService.class);
22     }
23
24     public Map<String, IService> getMap() {
25         return map;
26     }
27 }

2.借助ServiceLoader类

ServiceLoader是JDK自带的一个类加载器,位于java.util包当中,作为 A simple service-provider loading facility. 具体使用方式如下:

1.在META-INF/services/目录下用你的接口全路径名称命名一个文件(不加后缀),然后在该文件中一行一个添加你的接口实现类的全路径名。

2.通过load方法来加载出所有的接口实现类

1 ServiceLoader<MyInterface> loader = ServiceLoader.load(MyInterface.class);

在这里load方法的返回值是一个迭代器,用这个迭代器可以遍历出所有的接口实现类。

总结

以上两种方式,实现的功能都是一样的,实现方式不同,底层用的技术一样的,都是反射。至于选择哪一种,我建议如果项目中的接口实现类都被Spring托管了,那当然是直接用Spring了。如果没有用到Spring的话,那就用ServiceLoader,这个肯定是没有问题的。

转载于:https://www.cnblogs.com/heaveneleven/p/9125228.html

Java获取接口所有实现类的方式相关推荐

  1. java获取IP地址和MAC地址方式

    java获取IP地址和MAC地址方式 前端和后台都可以获取 ip获取方式比较简单,就不做分析了,主要说mac的获取 前端获取的方式与局限性:尝试好几种方式,这种是最易实现.最简单的方式,确实能获取该浏 ...

  2. java 获取接口的注解_java反射注解妙用-获取所有接口说明

    前言 最近在做项目权限,使用shiro实现restful接口权限管理,对整个项目都进行了重构.而权限管理需要用到所有的接口配置,包括接口url地址,接口唯一编码等.想要收集所有的接口信息,如果工程接口 ...

  3. java获取反射机制的三种方式

    更多免费教学文章请关注这里 java 获取反射常使用的三种方式: 1.通过new对象实现反射机制 2.通过路径实现反射机制 3.通过类名实现反射机制 通过Object类的getClass方法来获取 使 ...

  4. Java获取当前时间的四种方式

    面试时被问到如何获取系统当前时间,平时没有怎么注意这个问题,这里整理一下 import java.text.SimpleDateFormat; import java.util.Calendar; i ...

  5. Java容器接口及其实现类(JCF)

    参考文章,官方文档 Java容器接口分为两个部分,一个是最基础的接口 java.util.Collection,另一部分接口是基于java.util.Map 继承Collection的接口 java. ...

  6. java面向对象 接口和实现类_类实现java面向对象上:接口

    最近应用开发的过程中出现了一个小问题,顺便记录一下原因和方法--类实现 10.接口: 接口的设计:        1.应用接口处理多继承:        2.应用接口为外部类添加功能:        ...

  7. java获取接口数据类型_java中调用第三方接口获取数据的方式

    //get请求方式 private String getInfo(Map params,String URL) { // 创建Httpclient对象 CloseableHttpClient http ...

  8. 【Email】Java发送邮件接口与配置类

    说明 这文章17年的,不知道为啥,被放到草稿箱了.现在发表下. 转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 可能最近写博客时间不 ...

  9. Java 获取当前项目的类路径

    转载自 http://www.wolfbe.com/detail/201609/360.html# 摘要:web项目与普通Java项目获取类路径的方式有点不一样,因为web项目获取的是运行容器所在的路 ...

最新文章

  1. 第十六届全国大学生智能车竞赛华南赛区竞赛事宜的通知
  2. python画图代码彩虹-用python画一颗彩虹色爱心送给女朋友!!!
  3. HTML/CSS学习笔记02【表单标签】
  4. 6、jeecg 笔记之 自定义excel 模板导出(一)
  5. 计算机专业在湖南录取分数,计算机科学与技术专业分数线各大学排名(湖南)
  6. “砸7000万,这样的黑锅我们也不背。” 华人银行家的反击
  7. css怎么使用gpu加速,用CSS3开启GPU硬件加速来提升网站的动画渲染性能
  8. LeetCode(566)——重塑矩阵(JavaScript)
  9. 算法学习三:使用霍纳规则计算多项式
  10. Linux 安装python 模块及库
  11. opengl编程指南第9版源码编译注意事项
  12. CSC 命令编译cs文件
  13. 【播放器】媒体播放器三大架构
  14. IOT漏洞挖掘学习笔记(一)——堆基础及相关数据结构
  15. 统计自然语言处理梳理二:句法分析
  16. Java语言之父James Gosling
  17. Memwatch简介
  18. 人民币大写在线转换工具
  19. ZUCC_计算机网络实验_实验04 VLAN配置
  20. LCA(包含RMQ)

热门文章

  1. realtime multi-person 2D pose estimation using part affinity fields
  2. PDE8 wave equation: derivation
  3. php表格批量修改数据,php批量修改数据库表名前缀
  4. Python自然语言处理相,新词发现,主题模型,隐马尔模型词性标注,Word2Vec,情感分析...
  5. php长链接要配置,PHP链接到配置文件页面。 ?id =
  6. java里面比较重要的东西_Java面向对象程序设计中很重要的一些东西
  7. max std value 宏_【转载】:【C++跨平台系列】解决STL的max()与numeric_limits::max()和VC6 min/max 宏冲突问题...
  8. mysql前179天_做up主179天的经历
  9. 常见的php后门,有趣的PHP后门
  10. R-数据挖掘 | 聚类分析中的各种相异(似)度计算