精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SpringBoot+責任鏈實現接口動態編排!

開發 前端
項目中有一個 OpenApi 接口提供給客戶(上游系統)調用。這個接口中包含十幾個功能點,比如:入參校驗、系統配置校驗、基本數據入庫、核心數據入庫、發送給消息中心、發送給 MQ.....

一、背景

項目中有一個 OpenApi 接口提供給客戶(上游系統)調用。

這個接口中包含十幾個功能點,比如:入參校驗、系統配置校驗、基本數據入庫、核心數據入庫、發送給消息中心、發送給 MQ.....

不同的客戶對這個接口的要求也不同,有些功能不需要,有些需要添加特定功能。

二、思路

  • 基于以上背景,考慮把十幾個功能點進行拆分形成獨立的功能。因此使用責任鏈模式實現。
  • 創建一個抽象類(ComponentAbstract.java),每個拆分功能點繼承抽象類形成子類。
  • 子類創建時,需要在 @Component("1") 注解中設置類名,如果不設置咋使用默認的(小駝峰)名稱;關注公眾號:碼猿技術專欄,回復關鍵詞:1111 獲取阿里內部java性能調優手冊
  • 子類之間的數據通信使用自定義的上下文類(Contxt.java)子類中可以對上下文數據進行修改。(業務解耦)
  • 通過事先定義好的執行順序,通過 spring 的上下文 ApplicationContext 根據子類名稱循環獲取子類對象,執行抽象類中handlerRequest() 方法。
  • “事先定義好的執行順序”,可以保存到數據庫中項目啟動的時候加載到內存,或者直接維護到Redis中。我這邊直接使用接口進行演示:http://localhost:8082/test/chain?index=2,1,3,4

三、代碼

maven依賴,沒有特別的依賴fastjson用于測試時打印日志

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.76</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
</dependency>

ComponentAbstract.java 抽象類實現責任鏈的基礎

import com.liran.middle.liteflow.slot.Contxt;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StopWatch;

/**
 * 組件抽象類
 */
@Slf4j
publicabstractclass ComponentAbstract {

    public void handlerRequest(Contxt contxt) {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        // 執行子類業務邏輯
        this.doHandler(contxt);
        stopWatch.stop();
        long cost = stopWatch.getTotalTimeMillis();
        if (cost <= 10) {
            log.info("-----------監控統方法執行時間,執行 {} 方法, 用時優秀: {} ms -----------", getClass(), cost);
        } elseif (cost <= 50) {
            log.info("-----------監控統方法執行時間,執行 {} 方法, 用時一般: {} ms -----------", getClass(), cost);
        } elseif (cost <= 500) {
            log.info("-----------監控統方法執行時間,執行 {} 方法, 用時延遲: {} ms -----------", getClass(), cost);
        } elseif (cost <= 1000) {
            log.info("-----------監控統法執行時間,執行 {} 方法, 用時緩慢: {} ms -----------", getClass(), cost);
        } else {
            log.info("-----------監控方法執行時間,執行 {} 方法, 用時卡頓: {} ms -----------", getClass(), cost);
        }
    }
    abstract public void doHandler(Contxt contxt);
}

Test1.java 業務類1,繼承抽象類實現doHandler()方法,在@Component中設置類名1

import com.alibaba.fastjson.JSON;
import com.liran.middle.liteflow.slot.Contxt;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Component("1")
@Slf4j
publicclass Test1 extends ComponentAbstract {
    @Override
    public void doHandler(Contxt contxt) {
        log.info("Test1-順序1-上下文內容為:{}", JSON.toJSONString(contxt));
        contxt.setName("Test1");
        contxt.setAge("Test1");
        contxt.setAdrss("Test1");
        contxt.setUserid("Test1");
    }
}

Test2.java 業務類2,繼承抽象類實現doHandler()方法,在@Component中設置類名2

import com.alibaba.fastjson.JSON;
import com.liran.middle.liteflow.slot.Contxt;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Component("2")
@Slf4j
publicclass Test2 extends ComponentAbstract {

    @Override
    public void doHandler(Contxt contxt) {
        log.info("Test2-順序2-上下文內容為:{}", JSON.toJSONString(contxt));
        contxt.setName("Test2");
        contxt.setAge("Test2");
        contxt.setAdrss("Test2");
        contxt.setUserid("Test2");
    }
}

Test3.java 業務類3,繼承抽象類實現doHandler()方法,在@Component中設置類名3

import com.alibaba.fastjson.JSON;
import com.liran.middle.liteflow.slot.Contxt;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Component("3")
@Slf4j
publicclass Test3 extends ComponentAbstract {
    @Override
    public void doHandler(Contxt contxt) {
        log.info("Test3-順序3-上下文內容為:{}", JSON.toJSONString(contxt));
        contxt.setName("Test3");
        contxt.setAge("Test3");
        contxt.setAdrss("Test3");
        contxt.setUserid("Test3");
    }
}

Test4.java 業務類4,繼承抽象類實現doHandler()方法,在@Component中設置類名4

import com.alibaba.fastjson.JSON;
import com.liran.middle.liteflow.slot.Contxt;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Component("4")
@Slf4j
publicclass Test4 extends ComponentAbstract {

    @Override
    public void doHandler(Contxt contxt) {
        log.info("Test4-順序4-上下文內容為:{}", JSON.toJSONString(contxt));
        contxt.setName("Test4");
        contxt.setAge("Test4");
        contxt.setAdrss("Test4");
        contxt.setUserid("Test4");
    }
}

Contxt.java 業務上下文,用于每個子類(每個功能點)之間的數據通信。需要什么數據可以在此類中添加字段進行寫入,后面執行的類可以讀取。

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
publicclass Contxt {
    private String name;
    private String age;
    private String adrss;
    private String userid;
}

AopProxyUtils.java,spring 管理的上下文,用于根據類名獲取類實體。

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

@Component
publicclass AopProxyUtils implements ApplicationContextAware {

    privatestatic ApplicationContext applicationContext;

    /**
     * 實現ApplicationContextAware接口的setApplicationContext方法,
     * 用于注入ApplicationContext。
     */
    @Override
    public void setApplicationContext(ApplicationContext context) throws BeansException {
        applicationContext = context;
    }

    /**
     * 獲取指定類的代理對象,適用于需要事務或其他AOP增強的場景。
     *
     * @param clazz 要獲取代理的對象的類
     * @param <T>   泛型標記
     * @return 代理對象實例
     */
    publicstatic <T> T getProxyBean(Class<T> clazz) {
        if (applicationContext == null) {
            thrownew IllegalStateException("ApplicationContext not initialized.");
        }
        return applicationContext.getBean(clazz);
    }

    public static Object getProxyBean(String name) {
        return applicationContext.getBean(name);
    }
}

LiteFlowController.java 用于測試,演示如何動態編排。調用接口http://localhost:8082/test/chain?index=2,1,3,4 傳入不同的index順序,業務邏輯中執行的順序也不同。

import com.alibaba.fastjson.JSON;
import com.liran.middle.liteflow.component.pattern.chain.ComponentAbstract;
import com.liran.middle.liteflow.slot.Contxt;
import com.liran.middle.liteflow.utils.AopProxyUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping(value = "/test")
@Slf4j
publicclass LiteFlowController {
    /**
     * 不使用框架,手動實現動態業務編排
     *
     * @param index 類名稱
     * @return
     */
    @GetMapping(value = "chain")
    public String pattern(@RequestParam String index) {
        Contxt contxt = new Contxt().builder()
                .age("初始化")
                .adrss("初始化")
                .name("初始化")
                .userid("初始化")
                .age("初始化")
                .build();
        String[] split = index.split(",");

        for (String className : split) {
            // 此處直接根據類名從 spring 管理的上下文中進行獲取。這里的類名是子類注解@Component("1")中自定義的,如果沒有定義的話,默認使用類名
            // 使用這種方式可以保證類名不重復。
            ComponentAbstract msgHandler = (ComponentAbstract) AopProxyUtils.getProxyBean(className);
            if (ObjectUtils.isNotEmpty(msgHandler)) {
                msgHandler.handlerRequest(contxt);
            } else {
                log.info("沒有找到對應的組件: {}", className);
            }
        }
        return JSON.toJSONString(contxt);
    }
}

四、注意

其實要實現這個功能使用 LiteFlow 框架最合適,文檔友好,接入簡單,功能強大。

LiteFlow 框架官網:https://liteflow.cc/pages/5816c5/

作者提供的代碼示例:https://gitee.com/bryan31/liteflow-example

我是因為公司內部對依賴包的引入有要求審核嚴格,所以自己實現了一個簡單版本的。

責任編輯:武曉燕 來源: 碼猿技術專欄
相關推薦

2022-12-28 08:08:57

2024-12-03 15:52:45

責任鏈Java

2023-12-18 15:04:00

虛擬線程計算

2025-09-04 02:00:00

策略責任鏈簽章

2012-03-28 13:28:56

Java設計模式

2022-11-01 08:46:20

責任鏈模式對象

2021-12-24 07:50:45

責任鏈模式設計

2022-07-01 08:36:44

流編排主流框架

2023-06-25 08:12:02

2021-07-14 10:08:30

責任鏈模式加工鏈

2024-06-04 13:11:52

Python行為設計模式開發

2025-09-09 00:00:01

2025-09-29 04:00:00

2025-05-13 04:15:00

2021-06-09 07:15:15

責任鏈模式漲薪

2010-04-01 09:10:03

PHP設計模式責任鏈模式

2021-06-05 17:59:00

責任鏈模式設計

2023-09-28 08:45:56

開源責任鏈模式

2025-08-26 04:00:00

2021-05-25 09:00:52

責任鏈模式設計模式面試經歷
點贊
收藏

51CTO技術棧公眾號

欧美精品黑人猛交高潮| 欧美精品久久| 青青草原在线免费观看视频| 国产丝袜一区| 欧美三日本三级三级在线播放| 一级二级三级欧美| 老牛影视av牛牛影视av| 日韩精品一二三| 欧美日韩国产999| 日本xxxxxxxxx18| 人人九九精品视频| 色国产精品一区在线观看| 国产资源第一页| 国产二区视频在线观看| 国产成人精品亚洲午夜麻豆| 国产大片精品免费永久看nba| 欧美日韩色视频| 蜜桃视频欧美| 欧美精品一区男女天堂| 亚洲免费黄色网| 亚洲美女尤物影院| 亚洲精品国产品国语在线app| 欧美综合77777色婷婷| 丰满人妻一区二区三区免费| 久久99精品国产.久久久久| 7777精品视频| 97视频在线观看免费高清完整版在线观看| 国产欧美日韩网站| 在线视频二区| 91论坛在线播放| 肥熟一91porny丨九色丨| 亚洲一线在线观看| 日韩精品电影在线| 18一19gay欧美视频网站| 18岁成人毛片| 93在线视频精品免费观看| 亚洲精品小视频| 欧美成人三级伦在线观看| 久久综合给合| 欧美一区二区在线观看| www.cao超碰| 国产精品原创视频| 欧美中文字幕一二三区视频| 丰满人妻中伦妇伦精品app| 中文字幕有码在线视频| 中文字幕一区二区三区不卡在线| 日韩精彩视频| 国产福利在线视频| 欧美经典一区二区| 亚洲高清视频一区二区| 成人免费黄色网页| 欧美国产欧美综合| 日韩一本精品| 国内在线免费高清视频| 久久欧美一区二区| 欧美精品成人一区二区在线观看| 深夜影院在线观看| 久久婷婷成人综合色| 精品亚洲一区二区三区四区五区高| 人人妻人人玩人人澡人人爽| 成人美女视频在线看| 国产成人免费观看| 天天操天天干天天插| 99re热这里只有精品视频| 精品产品国产在线不卡| 天堂av网在线| 久久精品在这里| 亚洲成人av动漫| 暖暖日本在线观看| 亚洲综合视频网| 免费成人午夜视频| 欧美日韩精品一区二区三区视频| julia中文字幕一区二区99在线| 欧美日韩国产在线看| 99999精品视频| 亚洲成a人片| 91精品综合久久久久久| 91精产国品一二三| 西瓜成人精品人成网站| 国产亚洲福利一区| 最新黄色av网址| 国内激情久久| 国产成人精品一区| 国产情侣自拍小视频| 国产91色综合久久免费分享| 久久av一区二区三区漫画| 国产视频网站在线| 亚洲欧美乱综合| 国产精品久久久久9999爆乳| 日韩欧美另类一区二区| 91麻豆精品国产91久久久久久久久 | 日韩电影二区| 久久天堂电影网| 久久久精品免费看| 精品无码三级在线观看视频| 国产欧美日韩亚洲| 毛片在线播放a| 亚洲www啪成人一区二区麻豆| 中文字幕视频在线免费观看| 亚洲大奶少妇| 尤物精品国产第一福利三区 | 国产精品欧美经典| 日韩视频精品在线| 欧美交换国产一区内射| 老司机午夜免费精品视频| 亚洲伊人成综合成人网| 理论视频在线| 亚洲综合免费观看高清完整版| 一本久道综合色婷婷五月| 亚洲一区二区电影| 这里只有精品在线播放| 国产手机在线视频| 国产寡妇亲子伦一区二区| 日韩av一区二区三区美女毛片| 日本电影在线观看| 欧美日韩国产一级片| 毛茸茸多毛bbb毛多视频| 欧美成人嫩草网站| 国产美女精彩久久| 精品亚洲综合| 欧美日韩性视频| 成人做爰69片免费| 国产高清一区二区| 国产精品久久久久免费a∨大胸| 成人毛片视频免费看| 中文字幕一区二区三区四区不卡| jizzjizzxxxx| 老司机精品视频在线播放| 蜜臀久久99精品久久久无需会员| 波多野结衣家庭主妇| 91免费视频网址| 免费人成自慰网站| 日本精品在线播放| 久久婷婷国产麻豆91天堂| 中文字幕在线播出| 国产视频一区二区在线观看| 欧美在线观看www| 免费看久久久| 韩国三级电影久久久久久| 性欧美videos另类hd| 亚洲精品中文字幕在线观看| 污污视频在线免费| 亚洲第一偷拍| 亚洲r级在线观看| 国产欧美黑人| 日韩一区二区三区四区五区六区| 婷婷国产成人精品视频| 老鸭窝一区二区久久精品| 神马影院我不卡午夜| 在线视频cao| 亚洲欧美精品suv| 无码人妻一区二区三区免费| 91麻豆产精品久久久久久 | 国产传媒在线| 日韩电影中文字幕在线| 六月丁香激情综合| 久久丝袜美腿综合| 日本新janpanese乱熟| 精品国产一区探花在线观看| 国产第一区电影| 欧美三级电影一区二区三区| 91麻豆精品国产无毒不卡在线观看 | 在线精品国产亚洲| 国内精品视频久久| 日韩欧美电影在线观看| 欧洲精品在线观看| 亚洲熟女毛茸茸| 国产激情一区二区三区四区 | 7777精品伊人久久久大香线蕉最新版| 中文字幕五月天| 国产.欧美.日韩| 18岁网站在线观看| jlzzjlzz亚洲女人| 亚洲bt天天射| 免费高潮视频95在线观看网站| 亚洲日本成人女熟在线观看| 91在线观看喷潮| 亚洲国产精品尤物yw在线观看| free性中国hd国语露脸| 全国精品久久少妇| www.-级毛片线天内射视视| 粉嫩久久久久久久极品| 国产97色在线|日韩| 免费日本一区二区三区视频| 精品88久久久久88久久久| 人妻丰满熟妇av无码区| 亚洲欧洲美洲综合色网| 天堂www中文在线资源| 蜜桃视频第一区免费观看| 欧美高清中文字幕| 国模吧精品视频| 亚洲淫片在线视频| 日韩美女在线看免费观看| 欧美成人免费va影院高清| 午夜视频1000| 欧美一区二区三区影视| 国产黄网在线观看| 一区二区三区在线视频免费| 欧美日韩高清丝袜| 高清成人免费视频| 91福利国产成人精品播放| 激情亚洲网站| 少妇熟女一区二区| 女人av一区| 成人在线观看网址| 久久91超碰青草在哪里看| 午夜精品久久久久久久99黑人| 在线免费看黄| 精品视频一区在线视频| 精品人妻无码一区二区| 精品视频123区在线观看| 国产午夜小视频| 日韩美女视频一区| 在线观看亚洲大片短视频| 成人激情校园春色| 91在线第一页| 青青草精品视频| 99精品视频播放| 日韩午夜在线电影| 欧美一二三不卡| 91亚洲一区| 日韩影视精品| 久久不见久久见国语| 国产高清精品一区| 日韩精品久久久久久久软件91| 国产精品久久久久国产a级| 色在线免费观看| 韩国精品久久久999| 女人天堂av在线播放| 日韩三级影视基地| 米奇777四色精品人人爽| 中文字幕精品av| 国产免费a∨片在线观看不卡| 日韩成人在线免费观看| 日本人妻熟妇久久久久久| 精品欧美乱码久久久久久1区2区| 国产毛片一区二区三区va在线| 欧美视频在线不卡| 欧美成人一区二区视频| 欧美专区日韩专区| 少妇又紧又色又爽又刺激视频| 色久综合一二码| 国产精品熟女视频| 色噜噜久久综合| 91porny九色| 欧美性一二三区| 一女二男一黄一片| 在线成人小视频| 国产成年妇视频| 欧美zozo另类异族| 欧洲av在线播放| 日韩av在线网址| 玖玖综合伊人| 在线播放精品一区二区三区| 午夜视频成人| 久久国产精品亚洲| av中文资源在线资源免费观看| 欧美性视频网站| 韩国精品主播一区二区在线观看| 国产精品黄页免费高清在线观看| 四虎影视成人精品国库在线观看 | 欧美高清在线观看| 成人性生交大片免费看网站| 8050国产精品久久久久久| 中文字幕一区久| 国产精品久久久久7777| 牛牛国产精品| www.成年人视频| 一区二区黄色| 亚洲人成无码www久久久| 日本三级亚洲精品| 在线视频一二区| 成人小视频免费观看| 无码人妻aⅴ一区二区三区| 国产亚洲一区二区三区四区| 懂色av粉嫩av蜜臀av一区二区三区| 亚洲欧美成aⅴ人在线观看| 久久精品人妻一区二区三区| 岛国av一区二区在线在线观看| 久久久久久无码精品大片| 欧美男人的天堂一二区| 内射后入在线观看一区| 亚洲欧美日韩精品久久| 欧美激情二区| 午夜伦理精品一区| 福利精品在线| 成人在线观看av| 青青一区二区三区| 91成人综合网| 日本va欧美va精品发布| 乱码一区二区三区| 国产日韩视频一区二区三区| 欧美日韩免费做爰视频| 色综合久久久网| a级片在线播放| 亚洲欧洲午夜一线一品| 天堂成人av| 国产精品黄页免费高清在线观看| 亚洲1区在线| 日本高清视频一区二区三区| 午夜天堂精品久久久久| 免费av网址在线| 国产成人免费视频网站高清观看视频| 非洲一级黄色片| 亚洲国产成人porn| 6—12呦国产精品| 亚洲精品中文字幕av| 污视频在线看网站| 国产精品视频久久久久| 欧美日韩看看2015永久免费 | 成人黄色免费片| 丰满少妇一区二区三区| 日韩福利视频导航| 午夜久久久久久久| 亚洲欧美色一区| 99久久久无码国产精品免费蜜柚| 精品国产成人在线影院| 亚洲成人影院麻豆| 欧美亚洲另类激情另类| 永久免费精品视频| 免费的av在线| 精品在线一区二区三区| 亚洲无人区码一码二码三码的含义| 精品国产乱码久久久久久虫虫漫画| 亚洲av无码一区二区三区dv| 久久精品视频免费播放| 欧美爱爱视频| 色女孩综合网| 老司机精品导航| 亚洲 小说 欧美 激情 另类| 精品人伦一区二区三区蜜桃网站| 亚洲男女视频在线观看| 久久99国产精品自在自在app| 日韩一区中文| 欧美亚洲视频一区| 毛片av一区二区| 99久久99久久精品免费看小说. | 国产白丝袜美女久久久久| 成人午夜激情影院| 国产一级二级毛片| 精品国产人成亚洲区| 人人超在线公开视频| 成人综合av网| 狠狠干综合网| 亚洲一区二区在线免费| 午夜天堂影视香蕉久久| 天天操天天干天天干| 69av成年福利视频| 九色精品国产蝌蚪| 三级在线视频观看| 国产精品久久久久久久久图文区| 中文字幕乱码一区二区| xxx成人少妇69| 日韩成人久久| 欧美视频免费看欧美视频| 岛国一区二区在线观看| 久久精品国产亚洲av高清色欲| 精品福利一二区| 在线天堂资源www在线污| 日本免费高清一区二区| 麻豆高清免费国产一区| 国产综合av在线| 91另类视频| 图片区小说区区亚洲五月| 蜜臀av性久久久久蜜臀aⅴ| 婷婷国产成人精品视频| 日韩色在线观看| 手机在线观看av网站| 日韩视频在线播放| 国产在线一区观看| www.天天色| 在线播放国产一区中文字幕剧情欧美| 亚洲精品无播放器在线播放| 久青草视频在线播放| 久久亚洲捆绑美女| 亚洲一卡二卡在线| 久久久久久av| 国产区精品区| 在线观看视频你懂得| 欧美性videos高清精品| 97超碰国产一区二区三区| 91一区二区三区| 久久一区二区三区四区五区| 欧美做爰爽爽爽爽爽爽| 亚洲国产精品网站| 欧美亚洲二区| 国产深夜男女无套内射| 中文字幕欧美一| 欧美一级特黄aaaaaa| 国产精品亚洲片夜色在线| 亚洲国内欧美| 亚洲人做受高潮| 日韩国产激情在线| 成人综合日日夜夜| 国产三区在线视频| 一区二区三区四区中文字幕| 成人在线二区| 国产麻豆日韩| 国模无码大尺度一区二区三区| 伊人手机在线视频|