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获取接口所有实现类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring boot使用拦截器修改请求URL域名 换 IP 访问的方法

    spring boot使用拦截器修改请求URL域名 换 IP 访问的方法

    Spring Interceptor是一个非常类似于Servlet Filter 的概念 ,这篇文章主要介绍了spring boot使用拦截器修改请求URL域名 换 IP 访问的相关知识,需要的朋友可以参考下
    2022-09-09
  • 基于ArrayList初始化长度的作用及影响

    基于ArrayList初始化长度的作用及影响

    这篇文章主要介绍了基于ArrayList初始化长度的作用及影响,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Python爬虫之爬取2020女团选秀数据

    Python爬虫之爬取2020女团选秀数据

    本文将对比《青春有你2》和《创造营2020》全体小姐姐,鉴于两个节目的数据采集和处理过程基本相似,在使用Python做数据爬虫采集的章节中将只以《创造营2020》为例做详细介绍。感兴趣的同学可以照猫画虎去实操一下《青春有你2》的数据爬虫采集,需要的朋友可以参考下
    2021-04-04
  • springboot v2.0.3版本多数据源配置方法

    springboot v2.0.3版本多数据源配置方法

    这篇文章主要介绍了springboot v2.0.3版本多数据源配置方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2018-11-11
  • Spring Controller接收前端JSON数据请求方式

    Spring Controller接收前端JSON数据请求方式

    这篇文章主要为大家介绍了Spring Controller接收前端JSON数据请求方式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java 的可变参数方法详述

    Java 的可变参数方法详述

    这篇文章主要介绍了Java 的可变参数方法,可变参数只能作为函数的最后一个参数,在其前面可以有也可以没有任何其他参数,由于可变参数必须是最后一个参数,所以一个函数最多只能有一个可变参数,下面我们一起进入文章了解更多关于可变参数的内容吧
    2022-02-02
  • 详解Spring如何扫描自定义的注解

    详解Spring如何扫描自定义的注解

    本文给大家详细介绍了Spring如何扫描自定义的注解,在Spring中,可以使用注解来实现依赖注入、AOP等功能,同时,Spring也支持自定义注解,使得开发人员可以更灵活地使用注解,需要的朋友可以参考下
    2024-02-02
  • SpringMVC Mybatis配置多个数据源并切换代码详解

    SpringMVC Mybatis配置多个数据源并切换代码详解

    这篇文章主要介绍了SpringMVC Mybatis配置多个数据源并切换代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Springboot项目启动成功后可通过五种方式继续执行

    Springboot项目启动成功后可通过五种方式继续执行

    本文主要介绍了Springboot项目启动成功后可通过五种方式继续执行,主要包括CommandLineRunner接口,ApplicationRunner接口,ApplicationListener接口,@PostConstruct注解,InitalizingBean接口,感兴趣的可以了解一下
    2023-12-12
  • SpringBoot 静态资源导入及首页设置问题

    SpringBoot 静态资源导入及首页设置问题

    本节了解一下 SpringBoot 中 Web 开发的静态资源导入和首页设置,对应 SpringBoot-03-Web 项目,本节主要是从源码的角度,研究了一下静态资源导入和首页设置的问题
    2021-09-09

最新评论