Java获取接口所有实现类的方式详解

作者:heaven夏 时间:2022-06-11 14:44:27 

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

1.借助Spring容器实现

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


import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class ServiceLocator implements ApplicationContextAware{
 /**
  * 用于保存接口实现类名及对应的类
  */
 private Map<String, IService> map;

/**
  * 获取应用上下文并获取相应的接口实现类
  * @param applicationContext
  * @throws BeansException
  */
 @Override
 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
   //根据接口类型返回相应的所有bean
   Map<String, IService> map = applicationContext.getBeansOfType(IService.class);
 }

public Map<String, IService> getMap() {
   return map;
 }
}

2.借助ServiceLoader类

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

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

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


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

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

总结

以上两种方式,实现的功能都是一样的,实现方式不同,底层用的技术一样的,都是反射。至于选择哪一种,我建议如果项目中的接口实现类都被Spring托管了,那当然是直接用Spring了。如果没有用到Spring的话,那就用ServiceLoader,这个肯定是没有问题的。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

来源:https://www.cnblogs.com/heaveneleven/p/9125228.html

标签:Java,接口所有实现类
0
投稿

猜你喜欢

  • 使用WebSocket实现即时通讯(一个群聊的聊天室)

    2023-11-29 03:00:46
  • Java springboot yaml语法注解

    2023-06-17 08:13:35
  • 使用Jitpack发布开源Java库的详细流程

    2021-12-18 06:55:58
  • 解决RabbitMq消息队列Qos Prefetch消息堵塞问题

    2021-11-17 17:36:13
  • Java源码解析之object类

    2023-11-05 00:46:28
  • java创建子类对象设置并调用父类的变量操作

    2023-10-13 18:16:13
  • 浅谈Java 继承接口同名函数问题

    2023-07-22 13:28:47
  • 详解SpringBoot定制@ResponseBody注解返回的Json格式

    2023-07-26 13:47:02
  • Java实现map转换成json的方法详解

    2022-09-09 12:26:03
  • Java Annotation(Java 注解)的实现代码

    2023-01-09 00:36:17
  • vue+springboot前后端分离工程跨域问题解决方案解析

    2023-08-06 06:51:10
  • Java8中stream和functional interface的配合使用详解

    2023-02-27 22:44:51
  • Windows下Java环境配置的超详细教程

    2021-12-18 19:19:16
  • Spring boot + mybatis + orcale实现步骤实例代码讲解

    2023-07-11 22:50:09
  • Android Studio和Gradle使用不同位置JDK的问题解决

    2023-06-27 17:35:04
  • JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现

    2023-09-17 17:03:59
  • Java单例模式下的MongoDB数据库操作工具类

    2023-11-20 12:55:01
  • 一文带你了解C#中抽象方法与虚方法的区别

    2023-07-23 00:14:32
  • JAVA 字符串加密、密码加密实现方法

    2023-11-28 04:08:09
  • 分析JVM源码之Thread.interrupt系统级别线程打断

    2023-07-31 17:15:23
  • asp之家 软件编程 m.aspxhome.com