當需要實現一個嵌入式、可配置、可擴展的流程流時,引入功能齊全的 BPM 引擎往往過於笨重。本文展示如何利用面向切面編程(AOP)技術,結合 Spring AOP 與 AspectJ,構建一個輕量級、高可配置的流程編排方案,無需獨立流程引擎即可實現活動協調、狀態管理與轉移控制。
將流程視為一個空的目標對象(GenericProcess),通過攔截過濾器鏈(每個過濾器對應一個 POJO 活動)來裝配流程行為。這種「攔截過濾器模式」讓流程結構可聲明式配置,活動保持為無狀態的 POJO,實現關注點分離。
Spring AOP 基於代理,無法代理已被代理的攔截器。為了解決活動轉移邏輯(基於事實決定是否執行下一個活動)的橫切關注點,引入 AspectJ 的字節碼編織能力,通過 Around Advice 攔截攔截器調用,評估事實註冊表,決定是否執行目標活動。這實現了業務邏輯與流程控制邏輯的完全分離。
主流程包含三個活動:校驗物品數量 → 獲得貸記授權 → 配送。每個活動執行後註冊相應事實(如 VALIDATED_ITEM、CREDIT_AUTHORIZED),作為後續活動的前置條件。
void process(Object data),統一活動契約proceed() 或跳過!VALIDATED_ITEM 表示未註冊時才執行)META-INF/aop.xml 配置 AspectJ 載入時編織-javaagent:lib/spring-agent.jar 啟用 LTW