反射加缓存,解决不同的业务下调用不同的实现

根据前端传入不同的支付code,动态找到对应的支付方法,发起支付。
我们先定义一个注解。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface PayCode {
     String value();
     String name();
}

在所有的支付类上都加上该注解

@PayCode(value = "alia", name = "支付宝支付")
@Service
public class AliaPay implements IPay {

     @Override
     public void pay() {
         System.out.println("===发起支付宝支付===");
     }
}

@PayCode(value = "weixin", name = "微信支付")
@Service
public class WeixinPay implements IPay {

     @Override
     public void pay() {
         System.out.println("===发起微信支付===");
     }
}

@PayCode(value = "jingdong", name = "京东支付")
@Service
public class JingDongPay implements IPay {
     @Override
     public void pay() {
        System.out.println("===发起京东支付===");
     }
}

调用

@Service
public class PayService2 implements ApplicationListener {
     private static Map payMap = null;

     @Override
     public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
         ApplicationContext applicationContext = contextRefreshedEvent.getApplicationContext();
         Map beansWithAnnotation = applicationContext.getBeansWithAnnotation(PayCode.class);

         if (beansWithAnnotation != null) {
             payMap = new HashMap<>();
             beansWithAnnotation.forEach((key, value) ->{
                 String bizType = value.getClass().getAnnotation(PayCode.class).value();
                 payMap.put(bizType, (IPay) value);
             });
         }
     }

     public void pay(String code) {
        payMap.get(code).pay();
     }
}

PayService2类实现了ApplicationListener接口,这样在onApplicationEvent方法中,就可以拿到ApplicationContext的实例。这一步,其实是在spring容器启动的时候,spring通过反射我们处理好了。
我们再获取打了PayCode注解的类,放到一个map中,map中的key就是PayCode注解中定义的value,跟code参数一致,value是支付类的实例。
这样,每次就可以每次直接通过code获取支付类实例,而不用if…else判断了。如果要加新的支付方法,只需在支付类上面打上PayCode注解定义一个新的code即可。
注意:这种方式的code可以没有业务含义,可以是纯数字,只要不重复就行。

Original: https://www.cnblogs.com/vipsoft/p/16656940.html
Author: VipSoft
Title: 反射加缓存,解决不同的业务下调用不同的实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/610387/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 甲骨文严查Java授权,换openJDK要避坑

    背景 外媒The Register报道,甲骨文稽查企业用户,近期开始将把过去看管较松散的Java授权加入。 甲骨文针对标准版Java(Java SE)有2种商业授权。2019年4月…

    Java 2023年5月29日
    070
  • 【JavaWeb-jQuery】网站 — 应用 Ajax,jQuery 实现级联查询

    网站功能: 网页打开的时候,自动加载省份信息,用户通过选择不同的省份列表值,对应的城市信息也随之变化。 网站结构: 网站预览: 建表语句: CREATE TABLE pro ( i…

    Java 2023年6月8日
    083
  • Java避坑宝典《Java业务开发常见错误100例》上线了

    写这个专栏的缘起 之前我写过一篇博客:《朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的10种坑》,引起的关注还是挺多的。后来和极客时间的编辑一拍即合决定以这个为题写一个专栏…

    Java 2023年5月29日
    091
  • mybatis学习笔记(一)for 概念

    mybaits相关概念 1.1 mybatis简介 mybatis是是一款优秀的基于ORM的半自动轻量级持久层框架,它支持定制化SQL、存储过程以及高级映射。(与另一基于ORM的持…

    Java 2023年6月5日
    0104
  • 十三、常用类(完结)

    十三、常用类 13.1 包装类 13.1.1 包装类的分类 介绍:针对八种基本数据类型对应的引用类型作用:可以调用包装类里面的方法分类: 13.1.2 包装类的继承关系 学一个类首…

    Java 2023年6月5日
    057
  • SpringCloud之Gateway

    1.Gateway是什么? 1.1 为微服务提供简单有效的路由管理方式1.2 词汇(1)Route(路由) :构建网关的基础模块,由ID、目标URL、断言和过滤器等组成id:路由唯…

    Java 2023年6月13日
    076
  • [Java编程思想] 第五章 初始化与清理

    5.1 用构建器确保初始化 可以想象为每个类都定义一个initialize()方法,与类同名,让编译器在初始化期间自动调用。确保在你能操作对象之前,它已经被恰当地初始化。 从概念上…

    Java 2023年6月5日
    0119
  • 合并两个有序列表

    合并两个有序列表 问题重述: 问题分析: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: &#x8F93;&a…

    Java 2023年6月7日
    074
  • Java入门

    一、Java 1.1 为什么Java是平台无关性(可以跨平台) 二、Java环境 2.1、JRE 2.2、JDK 2.3、JVM 三、Java编译和运行的机制 四、Java基础 4…

    Java 2023年6月7日
    0120
  • js中$

    $符号在php中是表示变量的特征字符, 在js中它也有很多作用, 一般我们用来命名一个函数名称,获取id的1、首先可以用来表示变量,比如变量 var s=’asdsd&…

    Java 2023年5月29日
    099
  • 真正解决问题:maven eclipse tomcat java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

    在使用eclipse进行整合springmvc时经常会碰到这样的异常: java.lang.ClassNotFoundException:org.springframework.w…

    Java 2023年5月29日
    071
  • IntelliJ IDEA中如何优雅的调试Java Stream操作

    Stream操作是Java 8推出的一大亮点!虽然 java.util.stream很强大,但依然还是有很多开发者在实际工作中很少使用,其中吐槽最多的一个原因就是不好调试,一开始确…

    Java 2023年6月9日
    0100
  • JPA 入门实战(4)–Spring Data JPA 使用

    本文主要介绍 Spring Boot 中如何使用 Sping Data JPA,相关的环境及软件信息如下:Spring Boot 2.6.10。 1、Sping Data JPA …

    Java 2023年6月16日
    077
  • Springboot学习

    具体内容: 包含核心基础、Web原理、单元测试、数据访问、指标监控等章节 SpringBoot 官方文档 https://www.cnblogs.com/youcoding/p/1…

    Java 2023年5月30日
    0108
  • 20220808-final关键字

    1. 使用场景: 2. 注意细节: final关键字:可以修饰类、属性、方法和局部变量 1. 使用场景: 当不希望类被继承时,可以使用final修饰类 当不希望父类的某个方法被子类…

    Java 2023年6月15日
    072
  • 哈工大计算机系统大作业(2022)

    (论文封面略去) 本人博客链接(防扒): 本人CSDN博客: 何以牵尘的博客_CSDN博客-哈工大课内学习,哈工大精品课程笔记领域博主何以牵尘擅长哈工大课内学习,哈工大精品课程笔记…

    Java 2023年6月9日
    086
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球