java根据枚举值动态获取对象bean调用方法示例

news2024/12/25 0:16:37
1.创建操作枚举 
@Getter
@AllArgsConstructor
public enum CustomerOperatorType {

    /**
     * 用户操作记录分类
     */
    ACCOUNT("账户冻结/解冻"),
    LEVEL("等级记录"),
    SCORE( "积分记录");

    private final String desc;
}
2.公共基础类 
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseCustomerOpContent<T> {

    private String adminName;

    private String customerNo;

    private T data;

    public BaseCustomerOpContent(T data) {
        this.data = data;
    }

    public BaseCustomerOpContent(String adminName, String customerNo) {
        this.adminName = adminName;
        this.customerNo = customerNo;
    }
}
3.公共接口 

public interface OperatorRecorder<T> {
    /**
     * 记录
     * @param content
     */
    void record(BaseCustomerOpContent<T> content);
}
4.账户操作类 
@Data
public class AccountOpContent {
private String accountNo;
}
5.等级记录类 
@Data
public class LevelRecordContent {
    private String level;
}
6.账户操作记录实现方法 
@Component
@RequiredArgsConstructor
@Slf4j
public class AccountOpRecorder implements OperatorRecorder<AccountOpContent> {
    @Override
    public void record(BaseCustomerOpContent<AccountOpContent> opContent) {
        AccountOpContent accountOpContent=opContent.getData();
        System.out.println(accountOpContent.getAccountNo());
        
    }
}
7.等级操作记录实现方法 
@Component
@RequiredArgsConstructor
@Slf4j
public class LevelOpRecorder implements OperatorRecorder<LevelRecordContent> {
    @Override
    public void record(BaseCustomerOpContent<LevelRecordContent> content) {
        LevelRecordContent c=content.getData();
        System.out.println(c.getLevel());
    }
}
8.创建获取bean工具类 
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class ApplicationContextUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext;
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextUtil.applicationContext = applicationContext;

    }
    public static Object getBean(String beanName) {
        return applicationContext.getBean(beanName);
    }
    public static <T> T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }
}
 9.创建操作枚举
public enum CustomerOperatorEnum {

    /**
     * 记录用户
     **/
    ACCOUNT(CustomerOperatorType.ACCOUNT, AccountOpRecorder.class),
    LEVEL(CustomerOperatorType.LEVEL, LevelOpRecorder.class);


    private final CustomerOperatorType customerOperatorType;
    private final Class<? extends OperatorRecorder<?>> customerOperatorRecorder;

    CustomerOperatorEnum(CustomerOperatorType customerOperatorType, Class<? extends OperatorRecorder<?>> customerOperatorRecorder) {
        this.customerOperatorType = customerOperatorType;
        this.customerOperatorRecorder = customerOperatorRecorder;
    }

    public Class<? extends OperatorRecorder<?>> getRecorder() {
        return customerOperatorRecorder;
    }

    public static CustomerOperatorEnum findByShippingType(CustomerOperatorType customerOperatorType) {
        CustomerOperatorEnum[] values = CustomerOperatorEnum.values();
        return Arrays.stream(values).filter(operator -> operator.customerOperatorType == customerOperatorType)
                .findFirst()
                .orElseThrow(() -> new RuntimeException("不支持的结算类型:" + customerOperatorType));
    }

    public static OperatorRecorder<?> getRecorder(CustomerOperatorType customerOperatorType) {
        CustomerOperatorEnum operatorEnum = findByShippingType(customerOperatorType);
        return ApplicationContextUtil.getBean(operatorEnum.getRecorder());
    }}
10.使用示例 
  @GetMapping("demo")
    public void demo() {
        CustomerOperatorType customerOperatorType = CustomerOperatorType.ACCOUNT;
        AccountOpContent accountOpContent = new AccountOpContent();
        accountOpContent.setAccountNo("这是测试");
        BaseCustomerOpContent baseCustomerOpContent = new BaseCustomerOpContent();
        baseCustomerOpContent.setData(accountOpContent);
        OperatorRecorder<?> recorder = CustomerOperatorEnum.getRecorder(customerOperatorType);
        recorder.record(baseCustomerOpContent);
    }

调用结果 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1871341.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

word图题表题公式按照章节编号(不用题注)

预期效果&#xff1a; 其中3表示第三章&#xff0c;4表示第3章里的第4个图。标题、公式编号也是类似的。 为了达到这种按照章节编号的效果&#xff0c;原本可以用插入题注里的“包含章节编号” 但实际情况是&#xff0c;这不仅需要一级标题的序号是用“开始->多级列表”自动…

编码注入

Url&#xff1a;http://www.xxxxxxxx/newsdetail.php?idMjgxOA 判断参数Id存在数字型注入,试了报错注入不行&#xff0c;只能去盲注了 验证Poc1&#xff1a;idMTg4OS8x 等同于&#xff1a;id1889/1 poc2&#xff1a;idMTg4OS8w 等同于&#xff1a;id1889/0 /1 /0 用asci…

数据结构与算法笔记:高级篇 - B+树:MySql数据库索引是如何实现的?

概述 作为一名软件开发工程师&#xff0c;你对数据库肯定再熟悉不过了。MySQL 作为主流的数据库存储系统&#xff0c;它在我们的业务开发中&#xff0c;有着举足轻重的地位。在工作中&#xff0c;为了加速数据库中数据的查找速度&#xff0c;我们常用的处理思路是&#xff0c;…

Java基础教程:入门篇Java基础概念Java入门实例

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

Acitity跳转延时10s会导致anr的时序问题讨论

背景&#xff1a; 针对前些天直播时候&#xff0c;主要讲解是launcher启动app&#xff0c;Activity onResume延时10s不会anr&#xff0c;但是Activity内部activity1跳转activity2就会anr问题展开了讨论 https://mp.weixin.qq.com/s/_uA5yKUTUw-9H-tWxGNK9g 这个原因为啥已经在…

Tomcat WEB站点部署

目录 1、使用war包部署web站点 2、自定义默认网站目录 3、部署开源站点&#xff08;jspgou商城&#xff09; 对主机192.168.226.22操作 对主机192.168.226.20操作 上线的代码有两种方式&#xff1a; 第一种方式是直接将程序目录放在webapps目录下面&#xff0c;这种方式…

昇思25天学习打卡营第03天|张量Tensor

何为张量&#xff1f; 张量&#xff08;Tensor&#xff09;是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数&#xff0c;这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 &#x1d45b;维空间内&#xff0c;有  &#x1d45b;&a…

【LeetCode】六、哈希集合Set相关:存在重复元素判断 + MyHashSet设计

文章目录 1、Set集合2、Java中的Set集合3、leetcode217&#xff1a;存在重复元素4、P705&#xff1a;设计哈希集合 1、Set集合 无序&#xff1a;写进去的顺序和遍历读出来的顺序不一样不重复 主要作用&#xff1a;查看是否有重复元素&#xff08;给一个数组&#xff0c;转为…

WITS核心价值观【创新】篇|从财务中来,到业务中去

「客尊」、「诚信」、「创新」 与「卓越」 是纬创软件的核心价值观。我们秉持诚信态度&#xff0c;致力于成为客户长期且值得信赖的合作伙伴。持续提升服务厚度&#xff0c;透过数字创新实践多市场的跨境交付&#xff0c;助客户保持市场领先地位。以追求卓越的不懈精神&#xf…

Visual Studio 工具使用 之 即时窗口

即时窗口&#xff1a;是Visual Studio中的一个调试工具&#xff0c;它允许开发人员在调试过程中执行代码并查看结果。开发人员可以在即时窗口中输入和执行表达式、调用方法&#xff0c;并查看变量的值。即时窗口通常用于调试过程中的快速测试和验证代码的正确性。 就是下面的这…

[leetcode]圆圈中最后剩下的数字/ 破冰游戏

. - 力扣&#xff08;LeetCode&#xff09; class Solution {int f(int num, int target) {if (num 1) {return 0;}int x f(num - 1, target);return (target x) % num;} public:int iceBreakingGame(int num, int target) {return f(num, target);} };

编程入门指南

一、了解编程与编程语言 编程&#xff1a;编程是使计算机按照人类编写的指令进行工作的过程。这些指令被编写成计算机可以理解的代码&#xff0c;称为程序。编程语言&#xff1a;编程语言是人与计算机交流的工具。常见的编程语言有Python、Java、C、JavaScript等。 二、选择编…

继续捡钱,每天几百块!

每日操作计划&#xff1a; 标普信息科技(161128)&#xff0c;溢价8.5%&#xff0c;限购100&#xff0c;一拖七&#xff0c;单户每天700*8.5%59元 印度基金LOF(164824)&#xff0c;溢价2.6%&#xff0c;限购100&#xff0c;一拖七&#xff0c;单户每天700*2.6%18元 美元债LOF(…

C语言笔记26 •顺序表应用•

基于动态顺序表实现通讯录项目 1.通讯录其实也就是顺序表&#xff0c;就是把里面存的数据类型变了一下 &#xff0c;所以有一些方法对于顺序表适用&#xff0c;对于通讯录也是适用的&#xff08;初始化&#xff0c;销毁&#xff0c;内存空间扩容&#xff09;。 2.要用到顺序表…

个人网站搭建-步骤(持续更新)

域名申请 域名备案 域名解析 服务器购买 端口转发 Nginx要在Linux上配置Nginx进行接口转发&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装Nginx&#xff08;如果尚未安装&#xff09;&#xff1a; 使用包管理工具&#xff08;如apt, yum, dnf, 或zypper&#x…

工具篇:鸿蒙DevEco Studio5.0版本下载及安装

1、下载中心地址 下载中心 | 华为开发者联盟-HarmonyOS开发者官网&#xff0c;共建鸿蒙生态 2、安装 DevEco Studio支持Windows和macOS系统&#xff0c;下面将针对两种操作系统的软件安装方式分别进行介绍。 Windows环境 运行环境要求 为保证DevEco Studio正常运行&#…

Linux 基于sqlite3数据库的学生管理系统

一、数据库 sqlite官网&#xff1a;www.sqlite.org 1.1 数据库的安装 离线安装&#xff1a; sudo dpkg -i sqlite3_3.22.0-1ubuntu0.4_amd64.deb //数据库软件 sudo dpkg -i libsqlite3-dev_3.22.0-1ubuntu0.4_amd64.deb //数据库的库函数 在线安装&#xff1a; sudo apt-get …

绘唐3是免费的吗?

绘唐科技是一家中国电子信息产品制造商和供应商&#xff0c;成立于2005年。公司主要经营智能硬件、智能穿戴设备、智能家居设备和智能交通设备等领域的产品开发和销售。绘唐科技拥有强大的研发团队和制造能力&#xff0c;能够为客户提供定制化的产品解决方案。 绘唐科技的产品种…

diffusion model(十八):diffusion model中negative prompt的工作机制

info个人博客主页http://myhz0606.com/article/ncsn 前置阅读&#xff1a; DDPM&#xff1a; http://myhz0606.com/article/ddpm classifier-guided&#xff1a;http://myhz0606.com/article/guided classifier-free guided&#xff1a;http://myhz0606.com/article/classi…

多协议网关BL110钡铼6路RS485转MQTT协议云网关

在工业自动化的现代化进程中&#xff0c;物联网技术的应用日益广泛&#xff0c;特别是工业物联网网关作为连接传感器、控制器和云端平台的关键枢纽&#xff0c;发挥着至关重要的作用。BL110钡铼多协议网关作为一款专为工业环境设计的先进设备&#xff0c;不仅支持多种下行采集协…