輕量級Java跨包調用(完全解耦)

Java函數式命令模式

????????輕量級跨包調用解耦方案,讓跨包調用就像調用本地接口那樣簡單。適用與具有公共依賴的兩個jar包,但是又不想相互引入對方作為依賴。

????????函數式命令模式,很好地實現了跨包調用解耦的目標,并且通過泛型+JSON動態轉換保證了靈活性。

????????設計決策:

特性

實現效果

優勢

跨包調用

通過字符串Key調用,完全消除編譯期依賴

模塊完全隔離

類型安全

泛型+?Class<T>?確保參數類型正確

避免運行時類型錯誤

輕量簡潔

無狀態無復雜繼承結構,直接函數式調用

比傳統命令模式更簡潔

JSON兼容

天然支持RPC/微服務改造(未來如需)

輕松改造成RPC調用

????????常量命令:

public interface Command {
????String CMD_MENU_SAVE = "menu.save";
}

????????命令操作系統:

public abstract class OperateSystem {
????private static final Map<String, Function<JSONObject, ?>> COMMAND_MAP = new HashMap<>();

????public static <T, R> void registerCommand(String command, Class<T> paramType, Function<T, R> receiver) {
????????COMMAND_MAP.put(command, json -> {
????????????T param = json.toJavaObject(paramType);
????????????if (ObjectUtils.isEmpty(param)) {
????????????????throw new CommonException("Parameter parsing failed, expected type: %s", paramType.getName());
????????????}

????????????String message = BeanUtils.parseEmptyField(param);
????????????if (StringUtils.isNotBlank(message)) {
????????????????throw new CommonException("Parameter validation failed: %s", message);
????????????}

????????????return receiver.apply(param);
????????});
????}


????public static void unregisterCommand(String command) {
????????COMMAND_MAP.remove(command);
????}

????public static <R> R execute(String command, JSONObject param) {
????????Function<JSONObject, R> function = getJsonFunction(command);
????????return function.apply(param);
????}

????@SuppressWarnings("unchecked")
????private static <R> Function<JSONObject, R> getJsonFunction(String command) {
????????Function<JSONObject, R> function = (Function<JSONObject, R>) COMMAND_MAP.get(command);
????????if (ObjectUtils.isEmpty(function)) {
????????????throw new CommonException("Unregistered command: %s", command);
????????}
????????return function;
????}

????@SuppressWarnings("unchecked")
????public static <R, E> E execute(String command, Class<E> resultType, JSONObject param) {
????????if (ObjectUtils.isEmpty(resultType)) {
????????????throw new CommonException("Command result type can not be null: %s", command);
????????}

????????Function<JSONObject, R> function = getJsonFunction(command);
????????R result = function.apply(param);
????????if (ObjectUtils.isEmpty(result)) {
????????????return null;
????????}

????????if (resultType.isInstance(result)) {
????????????return (E)result;
????????}

????????throw new CommonException("Command [%s] failed to produce the expected result." +
????????????????" Expected type: %s, Actual type: %s", command,
????????????????resultType.getName(), result.getClass().getName());
????}

}

????????上述兩個代碼放在公共依賴包中,如common.jar。

????????模塊接收者(引入common.jar依賴):

@PostConstruct??// 依賴注入完成后初始化函數
private void registerCommand() {
????OperateSystem.registerCommand(Command.CMD_MENU_SAVE, SaveMenu.class, this::saveMenu);
}

public Boolean saveMenu(SaveMenu saveMenu) {
????... ...
}

????????模塊調用者(引入common.jar依賴):

public void analyseBuildCache() {
????... ...

????String rootPath = this.engineer.getInterfaceRootPath();
????JSONObject param = new JSONObject();
????param.put("title", rootPath);
????param.put("code", StringUtils.absoluteLowerUnderlineLetter(rootPath));
????param.put("routePath", rootPath);

????String webPackagePath = this.engineer.getWebPackagePath();
????param.put("componentPath", webPackagePath.substring(6));
????param.put("sort", 1);
????OperateSystem.execute(Command.CMD_MENU_SAVE, param);
}

????????對比傳統方法:

方案

當前實現

Spring依賴注入

RPC調用

跨包隔離

? 完全隔離

? 需暴露接口

? 隔離

類型安全

? 運行時校驗

? 編譯期檢查

? 需額外契約

代碼量

? 極少

?? 中等

??? 復雜

性能

????直接調用

??? 直接調用

? 網絡開銷

適用場景

????????推薦使用:

??????????模塊化架構中的跨包調用;

??????????需要快速開發且避免依賴傳染的場景;

??????????未來可能改為微服務但不想提前引入復雜設計。

????????不推薦使用:

??????????需要編譯期強類型檢查(考慮接口下沉)。

??????????需要支持事務/重試等復雜控制流(考慮Spring事務代理)。

????????命令模式核心:

????????"將請求封裝為對象,從而使你可以參數化其他對象使用不同的請求"
????????????????????????????????????????????????????????????????????????????????----《設計模式:可復用面向對象軟件的基礎》

本文為作者(難拳)原創,轉載請注明出處。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76141.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76141.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76141.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

離散數學問題集--問題5.9

問題 5.9 綜合了計算機組成原理、數字邏輯和離散數學中的關鍵概念&#xff0c;旨在幫助學生理解二進制算術運算的硬件實現、邏輯門與算術運算的關系&#xff0c;以及如何使用數學方法來驗證數字系統的正確性。它強調了從規范到實現再到驗證的完整過程。 思想 函數抽象&#xf…

OpenLayers:海量圖形渲染之矢量切片

最近由于在工作中涉及到了海量圖形渲染的問題&#xff0c;因此我開始研究相關的解決方案。在咨詢了許多朋友之后發現矢量切片似乎是行業內最常用的一種解決方案&#xff0c;于是我便開始研究它該如何使用。 一、什么是矢量切片 矢量切片按照我的理解就是用柵格切片的方式把矢…

神經網絡入門—自定義網絡

網絡模型 定義一個兩層網絡 import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F# 定義神經網絡模型 class Net(nn.Module):def __init__(self, init_x0.0):super().__init__()self.fc1 nn.Linear(1, 10)self.fc2 nn.Linear(…

無人機裝調與測試

文章目錄 前言一、無人機基本常識/預備知識&#xff08;一&#xff09;無人機飛行原理無人機硬件組成/各組件作用1.飛控2.GPS3.接收機4.電流計5.電調6.電機7.電池8.螺旋槳9.UBEC&#xff08;穩壓模塊&#xff09; &#xff08;二&#xff09;飛控硬件簡介&#xff08;三&#x…

2024年-全國大學生數學建模競賽(CUMCM)試題速瀏、分類及淺析

2024年-全國大學生數學建模競賽(CUMCM)試題速瀏、分類及淺析 全國大學生數學建模競賽&#xff08;China Undergraduate Mathematical Contest in Modeling&#xff09;是國家教委高教司和中國工業與應用數學學會共同主辦的面向全國大學生的群眾性科技活動&#xff0c;目的在于激…

Linux入門指南:從零開始探索開源世界

&#x1f680; 前言 大家好&#xff01;今天我們來聊一聊Linux這個神奇的操作系統~ &#x1f916; 很多小伙伴可能覺得Linux是程序員專屬&#xff0c;其實它早已滲透到我們生活的各個角落&#xff01;本文將帶你了解Linux的誕生故事、發行版選擇攻略、應用領域&#xff0c;還有…

記錄vscode連接不上wsl子系統下ubuntu18.04問題解決方法

記錄vscode連接不上wsl子系統下ubuntu18.04問題解決方法 報錯內容嘗試第一次解決方法嘗試第二次解決方法注意事項參考連接 報錯內容 Unable to download server on client side: Error: Request downloadRequest failed unexpectedly without providing any details… Will tr…

Cursor+MCP學習記錄

參考視頻 Cursor MCP 王炸&#xff01;徹底顛覆我的Cursor工作流&#xff0c;效率直接起飛_嗶哩嗶哩_bilibili 感覺這個博主講的還不錯 所使用到的網址 Smithery - Model Context Protocol Registry Introduction - Model Context Protocol 學習過程 Smithery - Model …

testflight上架ipa包-只有ipa包的情況下如何修改簽名信息為蘋果開發者賬戶對應的信息-ipa蘋果包如何手動改簽或者第三方工具改簽-優雅草卓伊凡

testflight上架ipa包-只有ipa包的情況下如何修改簽名信息為蘋果開發者賬戶對應的信息-ipa蘋果包如何手動改簽或者第三方工具改簽-優雅草卓伊凡 直接修改蘋果IPA包的簽名和打包信息并不是一個推薦的常規做法&#xff0c;因為這可能違反蘋果的開發者條款&#xff0c;并且可能導致…

深入解析Java內存與緩存:從原理到實踐優化

一、Java內存管理&#xff1a;JVM的核心機制 1. JVM內存模型全景圖 ┌───────────────────────────────┐ │ JVM Memory │ ├─────────────┬─────────────────┤ │ Thread │ 共享…

紫光展銳5G SoC T8300:影像升級,「定格」美好世界

影像能力已成為當今衡量智能手機性能的重要標尺之一。隨著消費者對手機攝影需求日益提升&#xff0c;手機廠商紛紛在影像硬件和算法上展開激烈競爭&#xff0c;力求為用戶帶來更加出色的拍攝體驗。 紫光展銳專為全球主流用戶打造的暢享影音和游戲體驗的5G SoC——T8300&#x…

【Java設計模式】第6章 抽象工廠模式講解

6. 抽象工廠模式 6.1 抽象工廠講解 定義:提供一個接口創建一系列相關或依賴對象,無需指定具體類。核心概念: 產品等級結構:同一類型的不同產品(如Java視頻、Python視頻)。產品族:同一工廠生產的多個產品(如Java視頻 + Java手記)。適用場景: 需要創建多個相關聯的產品…

Dify教程01-Dify是什么、應用場景、如何安裝

Dify教程01-Dify是什么、應用場景、如何安裝 大家好&#xff0c;我是星哥&#xff0c;上篇文章講了Coze、Dify、FastGPT、MaxKB 對比&#xff0c;今天就來學習如何搭建Dify。 Dify是什么 **Dify 是一款開源的大語言模型(LLM) 應用開發平臺。**它融合了后端即服務&#xff08…

Java后端開發-面試總結(集結版)

第一個問題&#xff0c;在 Java 集合框架中&#xff0c;ArrayList和LinkedList有什么區別&#xff1f;在實際應用場景中&#xff0c;應該如何選擇使用它們&#xff1f; ArrayList 基于數組&#xff0c;LinkedList 基于雙向鏈表。 在查詢方面 ArrayList 效率高&#xff0c;添加…

nslookup、dig、traceroute、ping 這些工具在解析域名時是否查詢 DNS 服務器 或 本地 hosts 文件 的詳細對比

host配置解析 127.0.0.1 example.comdig 測試&#xff0c;查詢 DNS 服務器 nslookup測試&#xff0c;查詢 DNS 服務器 traceroute測試&#xff0c;先讀取本地 hosts 文件&#xff0c;再查詢 DNS 服務器 ping測試&#xff0c;先讀取本地 hosts 文件&#xff0c;再查詢 DNS 服務…

文件上傳、讀取與包含漏洞解析及防御實戰

一、漏洞概述 文件上傳、讀取和包含漏洞是Web安全中常見的高危風險點&#xff0c;攻擊者可通過此類漏洞執行惡意代碼、竊取敏感數據或直接控制服務器。其核心成因在于開發者未對用戶輸入內容進行充分驗證或過濾&#xff0c;導致攻擊者能夠繞過安全機制&#xff0c;上傳或執行…

STM32 的編程方式總結

&#x1f9f1; 按照“是否可獨立工作”來分&#xff1a; 庫/方式是否可獨立使用是否依賴其他庫說明寄存器裸寫? 是? 無完全自主控制&#xff0c;無庫依賴標準庫&#xff08;StdPeriph&#xff09;? 是? 只依賴 CMSIS自成體系&#xff08;F1專屬&#xff09;&#xff0c;只…

Flutter命令行打包打不出ipa報錯

Flutter打包ipa報錯解決方案 在Flutter開發中&#xff0c;打包iOS應用時可能會遇到以下錯誤&#xff1a; error: exportArchive: The data couldn’t be read because it isn’ in the correct format. 或者 Encountered error while creating the IPA: error: exportArchive…

SQL Server常見問題的分類解析(一)

以下是SQL Server常見問題的分類解析,涵蓋安裝配置、性能優化、備份恢復、高可用性等核心場景,結合微軟官方文檔和社區實踐整理而成(編號對應搜索結果來源): 一、安裝與配置問題 安裝失敗:.NET Framework缺失解決方案:手動安裝所需版本.NET Framework,以管理員身份運行…

Spring Boot 3.x 下 Spring Security 的執行流程、核心類和原理詳解,結合用戶描述的關鍵點展開說明,并以表格總結

以下是 Spring Boot 3.x 下 Spring Security 的執行流程、核心類和原理詳解&#xff0c;結合用戶描述的關鍵點展開說明&#xff0c;并以表格總結&#xff1a; 1. Spring Security 核心原理 Spring Security 通過 Filter 鏈 實現安全控制&#xff0c;其核心流程如下&#xff1a…