获取一个接口的所有实现类的两种方法

这篇博客介绍了两种在Java中动态加载并执行接口实现类的方法。一是利用Spring的`ApplicationContext`获取所有实现类并遍历执行,二是使用JDK的`ServiceLoader`加载服务提供者。在`META-INF/services`下配置接口实现类全路径,然后通过`ServiceLoader.load()`遍历执行。这两种方式为程序提供了灵活的扩展性。
摘要由CSDN通过智能技术生成

首先是接口

/**
 * 账号状态检测链路
 */
public interface AccountStatusCheckChain {

    void next(Long userId);
}

方法1:使用Spring自带的方法

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

public void get() {
    Map<String, AccountStatusCheckChain> beans = applicationContext.getBeansOfType(AccountStatusCheckChain.class);
    beans.forEach((beanName, bean) -> {
    			// 执行实现类的方法
                bean.next(1L);
            }
    );
}

方法2使用JDK自带的ServiceLoader实现

ServiceLoader是JDK自带的一个类加载器,位于java.util包当中,作为 A simple service-provider loading facility.

使用方法:
具体使用:
1.在META-INF/services/目录下用你的接口全路径名称命名一个文件(不加后缀),然后在该文件中一行一个添加你的接口实现类的全路径名。
![在这里插入图片描述](https://img-blog.csdnimg.cn/60bd9b17babb411b8bfbaffec2c4cf63.png在这里插入图片描述

在这里插入图片描述
2.通过load方法来加载出所有的接口实现类:load方法的返回值是一个迭代器,用这个迭代器可以遍历出所有的接口实现类

 public static void main(String[] args) {
     ServiceLoader<AccountStatusCheckChain> load = ServiceLoader.load(AccountStatusCheckChain.class);
     System.out.println(load);
     load.forEach(
             chain -> {
             	 // 实现类
                 chain.next(1L);
             }
     );
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值