Java获取接口的所有实现类方法总结示例

 更新时间:2024年06月14日 11:29:56   作者:FeelTouch Labs  
这篇文章主要给大家介绍了关于Java获取接口的所有实现类方法的相关资料,文中通过代码介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下

业务开发中,有时需要获取到某个接口或抽象类的所有实现方法,然后再某个类中集中进行处理,都有哪些方法呢?

一、 如果是普通的Java应用,可以使用JDK自带的一个类加载器ServiceLoader,其实就是SPI机制。

ServiceLoaderloader = ServiceLoader.load(IWork.class);

因为在ServiceLoader.load的时候,是根据传入的接口类,遍历META-INF/services目录下的以该类命名的文件中的所有类,并实例化返回。所以,不适用于抽象类。

二、如果在Springboot工程中,接口的实现可以由IOC容器来托管,就可以非常简单的从Spring容器中获取到实现类集合。具体包括2种渠道。

  • 直接使用Spring注解@Autowired

  • 实现ApplicationContextAware接口获取并管理所有实现类。 就可以很简单的利用@Autowired来获取到实现类的list或map集合。

三、Springboot具体实现实例讲解

1)接口类

IWorkService.java

public interface IWorkService {
    String workPlace();
}

2)实现类

TeacherWorkService.java

@Service
public class TeacherWorkService implements IWorkService {

    @Override
    public String workPlace() {
        return "school";
    }
}

DoctorWorkService.java

@Service
public class DoctorWorkService implements IWorkService{

    @Override
    public String workPlace() {
        return "hospital";
    }
}

3)Aware实现类

WorkServiceLocator.java

@Component
public class WorkServiceLocator implements ApplicationContextAware {

    //手动获取,key是bean的name,value是实现类
    private Map<String, IWorkService> workServiceMap;
    
    //手动获取,list是所有的实现类
    private List<IWorkService> workServiceList;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        workServiceMap = applicationContext.getBeansOfType(IWorkService.class);
        workServiceList = new ArrayList<>(workServiceMap.values());
    }


    public Map<String, IWorkService> getAllMap() {
        return workServiceMap;
    }

    public IWorkService getByName(String beanName) {
        return workServiceMap.get(beanName);
    }


    public List<IWorkService> getAllList() {
        return workServiceList;
    }
    
}

3)Test入口类

@SpringBootTest(classes = {Application.class})
@RunWith(SpringRunner.class)
public class WorkServiceTest {

    /**
     * 方式1:直接使用spring依赖注入注解
     */
    @Autowired
    private Map<String, IWorkService> workServiceMap;

    /**
     * 方式2:直接使用spring的依赖注入注解
     */
    @Autowired
    private List<IWorkService> workServiceList;

    /**
     * 方式3:借助spring的ApplicationContextAware
     */
    @Autowired
    private WorkServiceLocator workServiceLocator;

    @Test
    public void testAll() {

        Map<String, IWorkService> allMap = workServiceLocator.getAllMap();
        List<IWorkService> allList = workServiceLocator.getAllList();

        IWorkService iWorkService = workServiceLocator.getByName("teacherWorkService");

    }
}

四、总结

对于普通的Java工程实现获取接口所有实现类需要借助SPI机制,且仅限于接口;对于Spring工程,则有@Autowired自动获取和实现ApplicationContextAware手动获取2种,既支持接口实现类、也支持抽象类的实现类。

附:java获取实现某个接口的所有实现类集合

关键在于: applicationContext.getBeansOfType(ChartService.class);

                  获得Map对象的key为实现类的名称如:chartSimpleServiceImpl

                  获得Map对象的value为实现类对象如: com.read.data.cms.service.impl.ChartExtraServiceImpl@5c85b6e9

applicationContext的获取方法有很多种,我这里暂列两种

第一种方式实现接口所有类集合(注解)

@Autowire
private ApplicationContext applicationContext;

Map<String,ChartService> res = applicationContext.getBeansOfType(ChartService.class);
res.get("实现类的字符串如:chartSimpleServiceImpl")
res.get获得的结果,就是当前实现类对象

第二种方式实现接口所有类集合(实现接口)

/**
 * @author: tianyong
 * @Time: 2019/6/26 11:17
 * @description:服务工厂(主要用于动态注入接口实现类)
 */
@Component
public class ServiceFactory implements ApplicationContextAware {

    //定义成员变量
    private static Map<String,ChartService> res;

    /**
      * @author: tianyong
      * @time: 2019/6/27 16:04
      * @description:设置上下文参数
      */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        res = applicationContext.getBeansOfType(ChartService.class);
    }

    /**
      * @author: tianyong
      * @time: 2019/6/27 16:05
      * @description:根据标记返回当前接口实现类
      */
    public static <T extends ChartService> T getServices(String flag){
        return (T)res.get(flag);
    }
}

到此这篇关于Java获取接口的所有实现类方法的文章就介绍到这了,更多相关Java获取接口所有实现类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

    SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

    SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案,本文给大家介绍SpringSecurity认证、注销、权限控制和注销、记住密码、自定义登入页等知识总结,感兴趣的朋友一起看看吧
    2025-03-03
  • SpringAop日志找不到方法的处理

    SpringAop日志找不到方法的处理

    这篇文章主要介绍了SpringAop日志找不到方法的处理方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • springboot的EnvironmentPostProcessor接口方法源码解析

    springboot的EnvironmentPostProcessor接口方法源码解析

    这篇文章主要介绍了springboot的EnvironmentPostProcessor接口方法源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Java找不到或无法加载主类及编码错误问题的解决方案

    Java找不到或无法加载主类及编码错误问题的解决方案

    今天小编就为大家分享一篇关于Java找不到或无法加载主类及编码错误问题的解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • 教你用java实现学生成绩管理系统(附详细代码)

    教你用java实现学生成绩管理系统(附详细代码)

    教学管理系统很适合初学者对于所学语言的练习,下面这篇文章主要给大家介绍了关于如何用java实现学生成绩管理系统的相关资料,文中给出了详细的实例代码,需要的朋友可以参考下
    2023-06-06
  • 深入了解Java中Cookie和Session的区别

    深入了解Java中Cookie和Session的区别

    会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话,常用的会话跟踪技术是Cookie与Session,本文就详细的介绍一下Java中Cookie和Session的区别,感兴趣的可以了解一下
    2023-06-06
  • 据说这个是可以撸到2089年的idea2020.2(推荐)

    据说这个是可以撸到2089年的idea2020.2(推荐)

    这篇文章主要介绍了据说这个是可以撸到2089年的idea2020.2,本教程给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Spring security基于数据库中账户密码认证

    Spring security基于数据库中账户密码认证

    这篇文章主要介绍了Spring security基于数据库中账户密码认证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java C++题解leetcode字符串轮转KMP算法详解

    Java C++题解leetcode字符串轮转KMP算法详解

    这篇文章主要为大家介绍了Java C++题解leetcode字符串轮转KMP算法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • SpringBoot监控SQL运行情况的流程步骤

    SpringBoot监控SQL运行情况的流程步骤

    Druid是Java语言中最好的数据库连接池,虽然 HikariCP 的速度稍快,但是,Druid能够提供强大的监控和扩展功能 ,也是阿里巴巴的开源项目,本文给大家介绍了SpringBoot监控SQL运行情况的流程步骤,需要的朋友可以参考下
    2024-03-03

最新评论