精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

色吊一区二区三区| 99久久国产免费看| 久久影院在线观看| 亚洲一级Av无码毛片久久精品| 波多野结衣乳巨码无在线观看| 99riav久久精品riav| 国产精品九九久久久久久久| 日本aⅴ在线观看| 欧美电影在线观看完整版| 91久久精品一区二区| 亚洲小视频在线播放| 日韩三级电影网| 精彩视频一区二区三区| 日本韩国欧美精品大片卡二| 免费看特级毛片| 天堂网av成人| 欧美一二三四在线| 熟妇人妻va精品中文字幕 | 亚洲韩国日本中文字幕| 欧美成人黄色网址| 超碰在线99| 中文字幕在线观看不卡| 久久福利电影| www久久久久久| 蜜臀国产一区二区三区在线播放| 久久久久久久久久久免费精品| 极品蜜桃臀肥臀-x88av| 开心激情综合| 日韩精品最新网址| 自拍偷拍一区二区三区四区| youjizz.com在线观看| 日韩 国产 欧美| 精品1区2区3区4区| 久久天天躁狠狠躁夜夜av| 91国模少妇一区二区三区| 91综合久久爱com| 欧美精品乱人伦久久久久久| 不卡影院一区二区| 国产在线精彩视频| 一区二区久久久| 一级黄色免费在线观看| av中文在线| 国产网站一区二区| 欧美黄色直播| 日韩av成人| av电影天堂一区二区在线观看| 亚洲在线视频观看| 国产尤物视频在线观看| 蜜桃免费网站一区二区三区| 国产成人精品视频在线观看| 草久久免费视频| 亚洲国产网站| 国内精品久久久| 国产在线一区视频| 亚洲第一毛片| 4p变态网欧美系列| 国产毛片aaa| 午夜在线观看免费一区| 88xx成人精品| 毛片在线免费视频| 另类亚洲自拍| 国产精品福利观看| 日韩精选在线观看| 蜜桃av一区二区| 国产日韩中文字幕| 国产三级在线观看视频| 国产精品一二三四区| 亚洲在线观看视频| 神马久久久久久久久久| 99久久精品情趣| 欧美成人在线免费观看| 粉嫩av在线播放| 自拍av一区二区三区| 亚洲啊啊啊啊啊| av资源在线播放| 色av综合在线| 爽爽爽在线观看| 91综合精品国产丝袜长腿久久| 日韩av在线播放资源| 99久久久久久久久久| 国产探花在线精品一区二区| 精品国偷自产在线视频| 久久久综合久久| 亚洲免费影视| 国产一区视频在线播放| 亚洲AV午夜精品| 91视频一区二区三区| 日韩伦理一区二区三区av在线| 青青青青在线| 亚洲午夜av在线| 成人免费xxxxx在线视频| 99tv成人影院| 亚洲国产欧美一区二区三区久久| 最近中文字幕免费| 伊人久久大香线蕉综合四虎小说 | 日韩免费看网站| v天堂中文在线| 日本激情一区| 国产+人+亚洲| 中文字幕在线观看你懂的| 国产福利一区二区三区视频在线 | 一区二区三区在线高清| 久久精品免费一区二区| 国产美女亚洲精品7777| 日韩理论片久久| 国产高潮流白浆| 丝瓜av网站精品一区二区| 91中文在线视频| 欧美色图另类| 一区二区三区四区乱视频| 国产在线青青草| 国产人与zoxxxx另类91| 亚洲欧洲日本专区| 国产真实夫妇交换视频| 美女www一区二区| 久久天堂国产精品| 色呦呦视频在线观看| 欧美日韩在线一区二区| www.88av| 伊人影院久久| 亚洲最大福利视频网| 黄色视屏网站在线免费观看| 亚洲国产日韩a在线播放性色| 91国产精品视频在线观看| 精品一区二区男人吃奶| 欧美日韩成人网| 一区二区三区午夜| 国产亚洲欧洲一区高清在线观看| 国产高清av在线播放| 激情综合婷婷| 精品国产一区久久久| 国产成人无码专区| 成人动漫视频在线| 国产成a人亚洲精v品在线观看| 国产精品原创视频| 亚洲最新av在线网站| 少妇一级淫片免费放中国| 国产成人免费xxxxxxxx| 三年中国中文在线观看免费播放 | 成人免费视频视频在| 男人的天堂在线视频免费观看 | 自拍偷拍国产精品| www.超碰97.com| 欧美日韩在线播放视频| 国产精品久久久久久久电影| 经典三级在线| 色婷婷激情久久| 女人被狂躁c到高潮| 国产农村妇女精品一二区| 精品亚洲第一| 亚洲深夜视频| 亚洲免费伊人电影在线观看av| 国产成人无码精品久在线观看 | 欧美日韩成人激情| 欧美人与禽zoz0善交| 日日夜夜精品视频天天综合网| 你懂的网址一区二区三区| 中文不卡1区2区3区| 亚洲开心激情网| 无码人妻精品一区二区| 国产欧美一区视频| 男人的天堂最新网址| 亚洲h色精品| av电影成人| 国产精品探花在线| 亚洲国产婷婷香蕉久久久久久 | 制服丝袜亚洲播放| 顶臀精品视频www| 成人午夜精品一区二区三区| 黄色一级在线视频| 色综合综合色| 成人国产在线视频| aa在线视频| 亚洲国产成人久久综合一区| 制服.丝袜.亚洲.中文.综合懂色| 久久日韩精品一区二区五区| 免费看污污网站| 中文字幕亚洲综合久久五月天色无吗'' | 日本欧洲国产一区二区| 黄色欧美视频| 欧美激情一区二区三区成人| 香蕉视频成人在线| 欧美日韩综合在线| 青青草原国产视频| 91在线视频免费观看| 美女黄色片视频| 午夜精品网站| 蜜桃视频在线观看成人| 久久久精品一区二区毛片免费看| 欧美成人精品不卡视频在线观看| 人妻精品一区一区三区蜜桃91| 色婷婷综合久久久中文一区二区| 日本一级片免费| av色综合久久天堂av综合| 国产91色在线观看| 影音先锋久久资源网| 日韩伦理一区二区三区av在线| 日韩不卡在线视频| 国产成人+综合亚洲+天堂| av网站免费在线观看| 亚洲欧洲成视频免费观看| 国产人妻精品一区二区三| 狠狠躁18三区二区一区| www.5588.com毛片| 久久影院视频免费| 99国产精品免费视频| 石原莉奈在线亚洲二区| 美女扒开大腿让男人桶| 久久综合99| 麻豆传媒一区| 亚洲国产视频二区| 国产精品视频一| 午夜裸体女人视频网站在线观看| 久久亚洲成人精品| 黄色在线观看网| 亚洲精品久久7777777| 999精品国产| 欧美色成人综合| 久久久国产精品成人免费| 亚洲狼人国产精品| 大胸美女被爆操| 国产亚洲制服色| 日本丰满少妇裸体自慰| 国产91对白在线观看九色| 潘金莲激情呻吟欲求不满视频| 久久国产欧美| 欧美色图色综合| 亚洲精品影视| 国产在线xxxx| 亚洲一级淫片| 免费看av软件| 欧美激情国产在线| 色综合电影网| 精品产国自在拍| 欧美极品jizzhd欧美| 里番精品3d一二三区| 成人av影视在线| 久久久久九九精品影院| 成人啪啪免费看| 综合久久av| 国产欧美日韩视频| 欧美亚洲二区| 国产精品日韩欧美综合| 依依综合在线| 人人做人人澡人人爽欧美| 伊人久久国产| 日本免费久久高清视频| 欧美xxx视频| 国产福利视频一区| 在线观看精品| 国产精品欧美在线| 日韩黄色碟片| 91久久嫩草影院一区二区| 国内精品视频| 国产高清自拍一区| 精品久久ai电影| 久久精品国产综合精品| 小说区图片区色综合区| 日本午夜精品一区二区三区| 成人毛片免费看| 椎名由奈jux491在线播放| 婷婷激情综合| 99久久99久久精品| 一区久久精品| 国产无套内射久久久国产| 久久久精品网| 久热精品在线播放| 国产精品一二三区在线| 国产精品熟妇一区二区三区四区| 不卡区在线中文字幕| 中文字幕丰满孑伦无码专区| 亚洲国产电影在线观看| 男人av资源站| 亚洲成a人v欧美综合天堂| 日本在线播放视频| 欧美日韩亚洲综合| a天堂在线观看视频| 亚洲福利视频网| 男女av在线| 久久久91精品国产一区不卡| 久久香蕉av| 国产999精品| 高清一区二区| 国产一区二区中文字幕免费看| 国产麻豆精品久久| ijzzijzzij亚洲大全| 亚洲视频二区| 超碰人人草人人| 99久久免费国产| 手机av在线看| 疯狂欧美牲乱大交777| 中文字幕 日韩有码| 欧美亚日韩国产aⅴ精品中极品| 国产成人av免费看| 亚洲欧美综合v| 性欧美1819sex性高清大胸| 5566日本婷婷色中文字幕97| 狂野欧美性猛交xxxx| 国产视频一区二区不卡| 欧美午夜18电影| 手机在线视频你懂的| 久热精品在线| 国产一卡二卡三卡四卡| 中文字幕一区二区不卡 | 国产在线欧美| 三级在线视频观看| 成人动漫精品一区二区| 黄色录像二级片| 在线看不卡av| 人妻无码一区二区三区久久99| 色妞在线综合亚洲欧美| 少妇淫片在线影院| av一区二区三区免费| 日韩在线综合| 成人小视频在线看| 成人黄色在线视频| 国产精品视频一区二区三| 欧美吻胸吃奶大尺度电影 | 91在线视频网址| 久久免费播放视频| 在线播放中文一区| 北条麻妃在线| 日本成人免费在线| 天堂在线精品| 免费一级特黄毛片| 国产成人鲁色资源国产91色综| 蜜桃av.com| 欧美日韩精品一区视频| 黄色软件在线观看| 欧美在线不卡区| 欧美久久香蕉| 色综合久久久久无码专区| 国产成人精品亚洲777人妖| 日本免费高清一区二区| 99久久久无码国产精品免费蜜柚| 欧美精品在线一区二区三区| 精品亚洲成a人片在线观看| 97免费在线视频| 操欧美女人视频| 精品人妻人人做人人爽| 国产伦精品一区二区三区免费| 少妇高潮惨叫久久久久| 欧美视频一区二区三区在线观看| 国产一级片在线| 国产精品高清免费在线观看| 精品国产aⅴ| 男女爽爽爽视频| 中文无字幕一区二区三区 | 欧美成人蜜桃| 国产精品视频久久一区| 在线免费观看a级片| 五月天亚洲精品| 日韩a级作爱片一二三区免费观看| 97成人在线视频| 亚洲动漫在线观看| 任你操这里只有精品| 中文字幕不卡在线观看| 一二三四区在线| 久久精品成人欧美大片| 高清久久一区| 91免费黄视频| 91老司机福利 在线| 久操视频在线免费观看| 中文字幕日韩精品在线| 小说区图片区亚洲| 337p亚洲精品色噜噜狠狠p| 丁香另类激情小说| 国语对白永久免费| 曰本色欧美视频在线| 成人亚洲精品| 日韩欧美一区二| 久久精品亚洲麻豆av一区二区| 伊人网综合在线| 色综合视频一区中文字幕| 欧美一级色片| 奇米影视四色在线| 亚洲在线视频一区| 欧美孕妇孕交| 91精品视频网站| 99国产精品99久久久久久粉嫩| 美女爆乳18禁www久久久久久 | 午夜福利视频一区二区| 国产精品精品国产| 中文在线播放一区二区| 一区二区三区免费在线观看视频| 欧美自拍偷拍一区| 少女频道在线观看高清| 日本一区二区三区免费观看| 激情五月婷婷综合网| 少妇一级淫片免费放中国| 日韩视频欧美视频| 欧美理伦片在线播放| 制服丝袜中文字幕第一页| 精品久久香蕉国产线看观看gif| 在线观看黄色av| 国产一区精品在线| 国内成人免费视频| 久久久久99精品成人片三人毛片| 久久激情五月丁香伊人| 亚洲人成网亚洲欧洲无码|