首页 > 编程语言 >java实现一个接口多个实现类,并且依次调用指定方法

java实现一个接口多个实现类,并且依次调用指定方法

时间:2023-06-12 21:46:19浏览次数:38  
标签:java 实现 class 接口 Order springframework org import public

接口

package cn.daenx.yhchatsdk.mytest;

public interface MyInterface {
    /**
     * 返回-1,后面的实现类将不再执行
     * 返回0,后面的实现类继续执行
     *
     * @return
     */
    Integer doSomething();
}

实现类

实现类1

package cn.daenx.yhchatsdk.mytest;

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;

@Service
@Order(2)
public class impl1 implements MyInterface {
    @Override
    public Integer doSomething() {
        System.out.println("执行1");
        return 0;
    }
}

实现类2

package cn.daenx.yhchatsdk.mytest;

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;

@Service
@Order(1)
public class impl2 implements MyInterface {
    @Override
    public Integer doSomething() {
        System.out.println("执行2");
        return 0;
    }
}

类加载器

package cn.daenx.yhchatsdk.mytest;

import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.core.annotation.Order;

import java.util.Map;

/**
 * 类加载器
 * 加载所有实现类
 */
public class MyInterfaceLoader {
    public static void load() {
        Map<String, MyInterface> beans = SpringUtil.getContext().getBeansOfType(MyInterface.class);
        for (Map.Entry<String, MyInterface> entry : beans.entrySet()) {
            MyInterface bean = entry.getValue();
            Class<?> clazz = bean.getClass();
            Order order = AnnotationUtils.findAnnotation(clazz, Order.class);
            if (order != null) {
                int value = order.value();
                System.out.println("@Order=" + value);
            }

            // 执行实现类的方法
            Integer integer = bean.doSomething();
            System.out.println("返回值=" + integer);
            // 如果返回值是-1,那么将不再继续执行
            if (integer == -1) {
                break;
            }
        }

    }
}

工具类

package cn.daenx.yhchatsdk.mytest;

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

@Component
public class SpringUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        SpringUtil.applicationContext = applicationContext;
    }

    public static ApplicationContext getContext() {
        return applicationContext;
    }
}

测试

@GetMapping("/test")
    public Result test() {
        MyInterfaceLoader.load();
        return Result.ok();
    }

后记

我这里测试是每次都会加载一次所有实现类,你可以弄个全局类,只在启动的时候加载一次即可,自己实现即可~

标签:java,实现,class,接口,Order,springframework,org,import,public
From: https://www.cnblogs.com/daen/p/17476172.html

相关文章

  • 通过python实现相机的立体匹配
    相机的立体匹配是一种通过双目相机拍摄同一场景的左、右两幅视点图像,运用立体匹配算法获取视差图,进而获取深度图的技术。这种技术可以用于三维重建、机器人视觉、虚拟现实等领域。本文将介绍如何使用Python实现相机的立体匹配。首先,我们需要安装OpenCV库。在命令行中输入以下命令:接......
  • Vue3基本功能实现
    vue3介绍#Vue3的变化#1.性能的提升 打包大小减少41%初次渲染快55%,更新渲染快133%内存减少54%#2.源码的升级 使用Proxy代替defineProperty实现响应式重写虚拟DOM的实现和Tree-Shaking#3.拥抱TypeScript Vue3可以更好的支持TypeScript......
  • 项目管理(一)——创建后端环境与测试接口
    一、创建项目(1)新建工程  在创建springboot或者springcloud项目时,idea默认使用https://start.spring.io作为脚手架,创建完成后手动去添加相关的jar包组合。  通过https://start.aliyun.com 可以直接勾选ali相关的jar包,快速的引入集成。下一步,在依赖中选择Web中的Spr......
  • Java网络编程
    Java网络编程什么是网络编程在网络通信协议下,不同计算机上运行的程序,进行的数据传输.常见的软件架构CS:客户端/服务器BS:浏览器/服务器BS架构优缺点CS架构优缺点总结网络编程三要素IP端口号协议总结......
  • 关于进程、线程、协程的概念以及Java中的应用
    进程、线程、协程本文将从“操作系统”、“Java应用”上两个角度来探究这三者的区别。一、进程在我本人的疑惑中,我有以下3个问题。1.1为什么要引入进程?在“多道程序环境下”,允许多个程序并发执行,此时它们将失去封闭性,并具有间断性以及不可再现性的特征,因此需要引入进程的概念......
  • 探索后疫情时代Airbnb实现逆周期增长的四大策略
    ​01.发挥P2P优势,打造差异化的“旅居生活体验”P2P(Peer-to-Peer)是一种点对点的网络模式,即用户之间可以直接进行交流和交易,无需通过中介或第三方机构。早期Airbnb对P2P的利用仅局限在空置房间的供应上,初期目标客户定位为只追求便宜价格的沙发客,这一客户群体不要求过多的舒适的住......
  • 基于XC7Z100+OV5640(DSP接口)YOLO人脸识别前向推理过程(部分4)
    AXI-DMA使用介绍内容概述如何在Zynq平台上使用AXI-DMA进行PS和PL之间的高带宽数据传输。主要包括以下几个部分:AXI-DMA的简介和模式选择AXI-DMA的寄存器配置和编程顺序Vivado工程的创建和IP核的添加Vitis工程的创建和示例代码的运行ILA信号的抓取和分析AXI-DMA的简介......
  • 专注开发者体验 | GitOps 实现 Kuberentes 持续部署
    大量的企业已经将Kuberentes用于其生产环境,但面对他们正在运行的多套不同阶段的Kuberentes集群,仍然困惑于在保证业务团队敏捷性的同时,如何实现持续部署,高安全性、权限分离以及可审计。我们认为GitOps是目前比较理想的一种方法来实现基于Kuberentes集群的持续部署,且同时......
  • CH32--裸机系统实现多任务
    在ram和flash资源足够的芯片中,我们通常通过跑操作系统来实现多任务,但此方法有个弊端,那就是对ram要求高,那么对于比如003这种只有2K ram的小容量芯片可能就不太够用了。这时就需要裸机来实现多任务了,方法如下:在裸机中,通常都是在一个while循环中,通过判断相应的标志位,来按照顺序......
  • 学习日记——接口和异常
    1.接口的定义(1)使用接口的原因接口可以实现“多”继承,一个类可以实现多个接口(2)什么是接口1.关键字:interface2.接口中的所有方法都是由publicabstract修饰的3.接口不能实例化4.实现类的关键字是implements必须实现接口的所有方法5.实现类可以实现多个接口(多继承)6.接口中......