AWS 現代化應用程式大型主機結構的轉換 - AWS 大型主機現代化

AWS Mainframe Modernization Service (受管執行期環境體驗) 不再向新客戶開放。對於與 AWS Mainframe Modernization Service (受管執行期環境體驗) 類似的功能,探索 AWS Mainframe Modernization Service (自我管理體驗)。現有客戶可以繼續正常使用該服務。如需詳細資訊,請參閱AWS 大型主機現代化可用性變更

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

AWS 現代化應用程式大型主機結構的轉換

本文件提供有關現代化應用程式結構的詳細資訊 (使用 AWS 大型主機現代化重構工具),以便開發人員可以完成各種任務,例如:

  • 順利導覽至應用程式。

  • 開發可從現代化應用程式呼叫的自訂程式。

  • 安全地重構現代化應用程式。

我們假設您已具備下列基本知識:

  • 舊版常見編碼概念,例如記錄、資料集及其對記錄的存取模式 -- 已編製索引、循序 --、VSAM、執行單位、jcl 指令碼、CICS 概念等。

  • 使用 Spring 架構進行 Java 編碼。

  • 在整個文件中,我們使用 short class names 來提供可讀性。如需詳細資訊,請參閱 AWS 大型主機完整名稱映射的轉換 擷取大型主機執行時間元素 AWS 轉換的對應完整名稱第三方完整名稱映射,以及擷取第三方元素的對應完整名稱。

  • 所有成品和範例都取自範例 COBOL/CICS CardDemo 應用程式的現代化程序輸出。

成品組織

AWS 大型主機現代化應用程式的轉換會封裝為 java Web 應用程式 (.war),您可以在 JEE 伺服器上部署。一般而言,伺服器是 Tomcat 執行個體,內嵌大型主機執行期的 AWS 轉換,目前建置在 SpringbootAngular (適用於 UI 部分) 架構上。

戰會彙總數個元件成品 (.jar)。每個 jar 都是專用 Java 專案的編譯結果 (使用 maven 工具),其元素是現代化程序的結果。

範例現代化應用程式成品。

基本組織依賴下列結構:

  • 實體專案: 包含商業模型和內容元素。專案名稱通常以「實體」結尾。一般而言,對於指定的舊版 COBOL 程式,這相當於 I/O 區段 (資料集) 和資料分割的現代化。您可以有一個以上的實體專案。

  • 服務專案: 包含傳統商業邏輯現代化元素。一般而言,COBOL 程式的程序分割。您可以有一個以上的服務專案。

  • 公用程式專案:包含其他專案使用的共用常見工具和公用程式。

  • Web 專案:適用時包含 UI 相關元素的現代化。不用於僅限批次的現代化專案。這些 UI 元素可能來自 CICSBMS 映射、IMSMFS 元件和其他大型主機 UI 來源。您可以有多個 Web 專案。

實體專案內容

注意

下列描述僅適用於 COBOL 和 PL/I 現代化輸出。RPG 現代化輸出是以不同的配置為基礎。

在任何重構之前,實體專案中的套件組織會與現代化程式繫結。您可以用幾種不同的方式來完成此操作。偏好的方式是使用重構工具箱,其會在您觸發程式碼產生機制之前運作。這是進階操作,在適用於大型主機訓練的 AWS 轉換中說明。如需詳細資訊,請參閱重構研討會。此方法可讓您保留稍後重新產生 Java 程式碼的功能,以受益於未來的進一步改善,例如)。另一種方法是使用您可能想要套用的任何 Java 重構方法,直接在產生的原始程式碼上執行定期 Java 重構,風險由您自行承擔。

範例程式 CBACT04C 實體套件。

程式相關類別

每個現代化計劃都與兩個套件相關:Business.context 和 business.model 套件。

  • base package.program.business.context

    business.context 子套件包含兩個類別,一個組態類別和一個內容類別。

    • 程式的一個組態類別,其中包含指定程式的特定組態詳細資訊,例如用來表示字元型資料元素的字元集、填補資料結構元素的預設位元組值等。類別名稱結尾為 "Configuration"。它會標記@org.springframework.context.annotation.Configuration註釋,並包含必須傳回正確設定Configuration物件的單一方法。

      Java 中的範例組態。
    • 一種內容類別,做為程式服務類別 (請參閱下文) 與模型子套件中的資料結構 (Record) 和資料集 (File) 之間的橋樑 (請參閱下文)。類別名稱以「內容」結尾,是 RuntimeContext 類別的子類別。

      範例內容類別 (部分檢視)
  • base package.program.business.model

    模型子套件包含指定程式可以使用的所有資料結構。例如,任何 01 層級的 COBOL 資料結構都會對應至模型子套件中的類別 (較低層級的資料結構是其擁有 01 層級結構的屬性)。如需如何現代化 01 資料結構的詳細資訊,請參閱什麼是大型主機 AWS Transform 中的資料簡化程式

    範例記錄實體 (部分檢視)

所有類別都會擴展 RecordEntity類別,代表對業務記錄表示法的存取。有些記錄具有特殊用途,因為它們繫結至 File。在建立檔案物件時,File會在內容類別中找到的對應 *FileHandler 方法中建立 Record和 之間的繫結。例如,以下清單顯示 TransactfileFile File 如何繫結至 transactFile Record(從模型子套件)。

檔案繫結的範例記錄。

服務專案內容

每個服務專案都隨附專用的 Springboot 應用程式,做為架構的骨幹。這是透過名為 的類別具體化SpringBootLauncher,位於服務 Java 來源的基本套件中:

服務專案 SpringBoot 應用程式。

此類別明顯負責:

  • 在程式類別與受管資源 (資料來源/交易管理員/資料集映射/等) 之間進行黏附。

  • ConfigurableApplicationContext 將 提供給程式。

  • 探索標示為彈簧元件 () 的所有類別@Component

  • 確保程式在 ProgramRegistry 中正確註冊 -- 請參閱負責此註冊的初始化方法。

程式註冊。

程式相關成品

若未事先重構,業務邏輯現代化輸出會依每個舊版程式的兩個或三個套件進行組織:

範例程式套件。

最詳盡的案例將包含三個套件:

  • base package.program.service:包含名為 Program Process 的界面,其具有處理商業邏輯的業務方法,可保留舊版執行控制流程。

  • base package.program.service.impl:包含名為 ProgramProcessImpl 的類別,這是上述程序界面的實作。這是舊版陳述式「轉譯」為 Java 陳述式的地方,依賴大型主機架構的 AWS 轉換:

    範例現代化 CICS 陳述式 (傳送 MAP、接收 MAP)
  • base package.program.statemachine:此套件可能不總是存在。當傳統控制流程的現代化必須使用狀態機器方法 (即使用 Spring StateMachine 架構) 來正確涵蓋傳統執行流程時,這是必要的。

    在這種情況下,狀態機器子套件包含兩個類別:

    • ProgramProcedureDivisionStateMachineController:擴展實作 StateMachineController(定義控制狀態機器執行所需的操作) 和 StateMachineRunner(定義執行狀態機器所需的操作) 介面的類別,用於驅動 Spring 狀態機器機制;例如,SimpleStateMachineController如範例案例所示。

      狀態機器控制器範例。

      狀態機器控制器會定義可能的可能不同狀態及其之間的轉換,以重現指定程式的舊版執行控制流程。

      建置狀態機器時,控制器是指在狀態機器套件中相關聯的服務類別中定義的方法,如下所述:

      subConfigurer.state(States._0000_MAIN, buildAction(() -> {stateProcess._0000Main(lctx, ctrl);}), null); subConfigurer.state(States.ABEND_ROUTINE, buildAction(() -> {stateProcess.abendRoutine(lctx, ctrl);}), null);
    • ProgramProcedureDivisionStateMachineService:此服務類別代表一些業務邏輯,這些邏輯必須與狀態機器控制器建立的狀態機器繫結,如前所述。

      此類別的方法中的程式碼使用狀態機器控制器中定義的事件:

      使用 statemachine 控制器事件的 Statemachine 服務。
      使用 statemachine 控制器事件的 Statemachine 服務。

      狀態機器服務也會呼叫上述的程序服務實作:

      .statemachine 服務呼叫程序實作

此外,名為 的套件base package.program會扮演重要角色,因為它會為每個程式收集一個類別,做為程式進入點 (稍後對此有更多詳細資訊)。每個類別都會實作Program界面,即程式進入點的標記。

程式進入點

其他成品

  • BMS MAPs配套

    除了程式相關的成品之外,服務專案還可以包含其他成品以供各種用途使用。在 CICS 線上應用程式的現代化情況下,現代化程序會產生 json 檔案,並放入 /src/main/resources 資料夾的映射資料夾中:

    在資源資料夾中的 BMS MAPs json 檔案。

    AWS Transform for mainframe 執行時間會使用這些 json 檔案,將 SEND MAP 陳述式所使用的記錄與畫面欄位繫結。

  • Groovy 指令碼

    如果舊版應用程式具有 JCL 指令碼,則這些指令碼已現代化為 groovy 指令碼,並存放在 /src/main/resources/scripts 資料夾中 (稍後該特定位置的詳細資訊):

    groovy 指令碼 (JCL 現代化)

    這些指令碼用於啟動批次任務 (專用、非互動式、密集 cpu 的資料處理工作負載)。

  • SQL 檔案

    如果舊版應用程式使用 SQL 查詢,則會使用命名模式 program.sql,在專用屬性檔案中收集對應的現代化 SQL 查詢,其中 program 是使用這些查詢的程式名稱。

    資源資料夾中的 SQL 檔案

    這些 sql 檔案的內容是 (key=query) 項目的集合,其中每個查詢都與唯一索引鍵相關聯,而現代化程式會使用這些索引鍵來執行指定的查詢:

    現代化程式使用的 sql 檔案範例。

    例如,COSGN00C 程式正在執行索引鍵為 "COSGN00C_1" 的查詢 (sql 檔案的第一個項目):

    依程式的範例查詢用量

公用程式專案內容

公用程式專案的名稱以「工具」結尾,包含一組技術公用程式,可供所有其他專案使用。

公用程式專案內容

Web 專案 (多個) 內容

Web 專案只有在現代化舊版 UI 元素時才存在。用來建置現代化應用程式的現代 UI 元素是以 Angular 為基礎。用來顯示現代化成品的範例應用程式是在大型主機上執行的 COBOL/CICS 應用程式。CICS 系統使用 MAPs 來代表 UI 畫面。對於每個映射,對應的現代元素將是 html 檔案,並隨附 Typescript 檔案:

現代化為角度的 CICS 映射範例

Web 專案僅負責應用程式的前端方面。依賴 公用程式和實體專案的服務專案提供後端服務。前端和後端之間的連結是透過名為 Gapwalk-Application 的 Web 應用程式建立,這是大型主機執行期分佈標準 AWS 轉換的一部分。

執行和呼叫程式

在舊版系統上,程式會編譯為獨立的可執行檔,可透過 COBOL CALL 陳述式等 CALL 機制呼叫自己,並在需要時傳遞引數。現代化應用程式提供相同的功能,但使用不同的方法,因為涉及成品的性質與舊版成品不同。

在現代化方面,程式進入點是實作Program界面的特定類別,是 Spring 元件 (@Component),位於名為 的套件中的服務專案中base package.program

程式註冊

每次啟動託管現代化應用程式的 Tomcat 伺服器時,也會啟動服務 Springboot 應用程式,這會觸發程式註冊。名為 的專用登錄ProgramRegistry檔會填入程式項目,每個使用其識別符註冊的程式,每個已知程式識別符各一個項目,這表示如果程式是由數個不同的識別符所知道,登錄檔會包含任意數量的項目,其中有識別符。

指定程式的註冊依賴於 getProgramIdentifiers() 方法傳回的識別符集合:

範例程式 (部分檢視)

在此範例中,程式註冊一次,名稱為 'CBACT04C' (查看 programIdentifiers 集合的內容)。tomcat 日誌會顯示每個程式註冊。程式註冊僅取決於宣告的程式識別符,而非程式類別名稱本身 (雖然通常符合程式識別符和程式類別名稱。

相同的註冊機制適用於大型主機 Web 應用程式的各種公用程式 AWS Transform 帶來的公用程式程式,這是大型主機執行期分佈 AWS 的 Transform 的一部分。例如,Gapwalk-Utility-Pgm Webapp 提供 z/OS 系統公用程式 (IDCAMS、ICEGENER、SORT 等) 的功能對等項目,並且可由現代化程式或指令碼呼叫。在 Tomcat 啟動時註冊的所有可用公用程式都會記錄在 Tomcat 日誌中。

指令碼和協助程式註冊

在 Tomcat 啟動時間,位於 /src/main/resources/scripts 資料夾階層的 groovy 指令碼會發生類似的註冊程序。指令碼資料夾階層會周遊,而探索到的所有 groovy 指令碼 (特殊 function.groovy 預留指令碼除外) 會使用其簡短名稱 (指令碼檔案名稱的一部分,位於第一個點字元之前) 做為擷取金鑰ScriptRegistry,在 中註冊。

注意
  • 如果多個指令碼的檔案名稱會導致產生相同的註冊金鑰,則只會註冊最新的 ,並覆寫該指定金鑰先前遇到的任何註冊。

  • 考量上述注意事項,當使用子資料夾做為註冊機制時,請注意 會扁平化階層,並可能導致非預期的覆寫。階層不會計入註冊程序中:通常 /scripts/A/myscript.groovy 和 /scripts/B/myscript.groovy 會導致 /scripts/B/myscript.groovy 覆寫 /scripts/A/myscript.groovy。

/src/main/resources/daemons 資料夾中的 groovy 指令碼處理方式略有不同。它們仍然註冊為一般指令碼,但此外,它們會在 Tomcat 啟動時間以非同步方式直接啟動一次。

在 中註冊指令碼後ScriptRegistry,REST 呼叫可以使用 Gapwalk-Application 公開的專用端點來啟動它們。如需詳細資訊,請參閱對應的文件。

呼叫程式的程式

每個程式都可以呼叫另一個程式做為子程式,並將參數傳遞給它。程式會使用 ExecutionController 界面的實作來執行此操作 (大多數時候,這會是ExecutionControllerImpl執行個體),以及名為 的流暢 API 機制CallBuilder來建置程式呼叫引數。

所有程式方法都採用 RuntimeContextExecutionController作為方法引數,因此 ExecutionController 一律可用於呼叫其他程式。

例如,請參閱下圖,其中顯示 CBST03A 程式如何將 CBST03B 程式呼叫為子程式,並將參數傳遞給程式:

.sub-program 呼叫範例
  • 的第一個引數ExecutionController.callSubProgram是要呼叫的程式識別符 (也就是用於程式註冊的其中一個識別符 -- 請參閱上述段落)。

  • 第二個引數是 建置的結果CallBuilder,是 的陣列Record,對應於從來電者傳遞給來電者的資料。

  • 第三個和最後一個引數是呼叫者RuntimeContext執行個體。

這三個引數都是強制性的,不能是 null,但第二個引數可以是空的陣列。

只有在原本設計時,受話方才能處理傳遞的參數。對於舊版 COBOL 程式,這表示具有 LINKAGE 區段和 USING 子句,讓程序分區使用 LINKAGE 元素。

例如,請參閱對應的 CBSTM03B.CBL COBOL 來源檔案:

COBOL 來源檔案中的範例連結

因此,CBSTM03B 程式採用單一 Record做為參數 (大小為 1 的陣列)。這是 CallBuilder 所建置的內容,使用 byReference() 和 getArguments() 方法鏈結。

CallBuilder 流暢的 API 類別有數種方法可用來填入要傳遞給受話方的引數陣列:

  • asPointer(RecordAdaptable):新增指標種類的引數,參考。指標代表目標資料結構的地址。

  • byReference(RecordAdaptable):依參考新增引數。發起人將看到受話方執行的修改。

  • byReference(RecordAdaptable):上一個方法的 varargs 變體。

  • byValue(Object):新增 引數,依Record值轉換為 。發起人不會看到被發起人執行的修改。

  • byValue(RecordAdaptable):與先前的方法相同,但引數可直接做為 使用RecordAdaptable

  • byValueWithBounds(Object, int, int):新增 引數,轉換為 Record,依值擷取指定邊界定義的位元組陣列部分。

最後,getArguments 方法會收集所有新增的引數,並以 陣列傳回這些引數Record

注意

發起人的責任是確保引數陣列具有所需的大小,以確保項目在記憶體配置方面具有連結元素的預期配置,具有正確排序和相容。

指令碼呼叫程式

從 groovy 指令碼呼叫已註冊的程式需要使用實作MainProgramRunner界面的類別執行個體。通常,透過 Spring 的 ApplicationContext 使用方式來取得這類執行個體:

.MainProgramRunner:取得執行個體

MainProgramRunner介面可用後,使用 runProgram 方法呼叫程式,並將目標程式的識別符做為參數傳遞:

MainProgramRunner:執行程式

在先前的範例中,任務步驟會呼叫 IDCAMS (檔案處理公用程式程式),提供實際資料集定義與其邏輯識別符之間的映射。

處理資料集時,舊版程式大多使用邏輯名稱來識別資料集。從指令碼呼叫程式時,指令碼必須對應邏輯名稱與實際的實體資料集。這些資料集可能位於檔案系統、Blusam 儲存體中,甚至由內嵌串流定義、串連數個資料集,或產生 GDG。

使用 withFileConfiguration 方法來建置邏輯到資料集的實體映射,並將其提供給呼叫的程式。

撰寫您自己的程式

為指令碼或其他現代化程式撰寫自己的程式來呼叫 是常見的任務。一般而言,在現代化專案中,當可執行式舊版程式以現代化程序不支援的語言撰寫,或來源已遺失 (是,可能會發生這種情況),或程式是無法使用來源的公用程式時,您會撰寫自己的程式。

在這種情況下,您可能必須自行在 Java 中撰寫缺少的程式 (假設您對程式預期的行為、程式引數的記憶體配置有的話,以此類推)。您的 Java 程式必須符合本文件所述的程式機制,以便其他程式和指令碼可以執行它。

若要確保程式可供使用,您必須完成兩個必要步驟:

  • 撰寫可正確實作Program界面的類別,以便進行註冊和呼叫。

  • 請確定您的程式已正確註冊,以便從其他程式/指令碼中可見。

撰寫程式實作

使用您的 IDE 來建立新的 Java 類別,以實作Program界面:

建立新的 Java 計劃類別

下圖顯示 Eclipse IDE,負責建立要實作的所有強制性方法:

建立新的 Java 程式類別 - 編輯來源

彈簧整合

首先,必須將 類別宣告為 Spring 元件。使用 註釋來註釋 類別@Component

使用 spring @Component 註釋

接著,正確實作所需的方法。在此範例內容中,我們將 MyUtilityProgram 新增至已包含所有現代化程式的套件。該置放允許程式使用現有的 Springboot 應用程式來提供 getSpringApplication 方法實作ConfigurableApplicationContext所需的 :

實作 getSpringApplication 方法。

您可以為自己的程式選擇不同的位置。例如,您可以在另一個專用服務專案中找到指定的程式。確定指定的服務專案有自己的 Springboot 應用程式,這可讓您擷取 ApplicationContext (應該是 ConfigurableApplicationContext)。

將身分提供給程式

若要讓其他程式和指令碼呼叫,程式必須至少提供一個識別符,這不得與系統中任何其他現有的已註冊程式衝突。識別符選擇可能是由需要涵蓋現有舊版程式取代所驅動;在這種情況下,您必須使用預期的識別符,如同在舊版程式中發現的 CALL 出現次數一樣。在舊版系統中,大多數的程式識別符長度為 8 個字元。

在程式中建立一組無法修改的識別符是執行此操作的一種方式。下列範例顯示選擇「MYUTILPG」作為單一識別符:

程式識別符範例

將程式與內容建立關聯

程式需要配套RuntimeContext執行個體。對於現代化程式,適用於大型主機的 AWS Transform 會使用屬於舊版程式的資料結構,自動產生配套內容。

如果您要撰寫自己的程式,您也必須撰寫配套內容。

參考 程式相關類別,您可以看到程式至少需要兩個配套類別:

  • 組態類別。

  • 使用 組態的內容類別。

如果公用程式程式使用任何額外的資料結構,則應一併寫入並供內容使用。

這些類別應位於套件中,該套件包含在應用程式啟動時掃描的套件階層中,以確保內容元件和組態將由 Spring 架構處理。

讓我們在base package.myutilityprogram.business.context套件中撰寫在實體專案中新建立的最小組態和內容:

新公用程式的新專用組態和內容

以下是組態內容。它使用的組態組建類似於附近的其他 -- 現代化 -- 程式。您可能必須根據您的特定需求自訂此項目。

新的程式組態

備註:

  • 一般命名慣例是 ProgramName Configuration。

  • 它必須使用 @org.springframework.context.annotation.Configuration 和 @Lazy 註釋。

  • Bean 名稱通常遵循 ProgramName ContextConfiguration慣例,但這並非強制性。請務必避免整個專案發生 Bean 名稱衝突。

  • 要實作的單一方法必須傳回Configuration物件。使用ConfigurationBuilder流暢的 API 來協助您建置。

以及相關聯的內容:

Java 檔案中的新程式內容。

備註

  • 內容類別應延伸現有的Context界面實作 ( RuntimeContextJicsRuntimeContext,這是RuntimeContext使用 JICS 特定項目增強的 )。

  • 一般命名慣例為 ProgramName Context。

  • 您必須將其宣告為原型元件,並使用 @Lazy 註釋。

  • 建構函數是指相關聯的組態,使用 @Qualifier 註釋以適當的組態類別為目標。

  • 如果公用程式程式使用一些額外的資料結構,它們應該是:

    • 寫入並新增至base package.business.model套件。

    • 內容中參考的 。查看其他現有的內容類別,了解如何參考資料細分類別,並視需要調整內容方法 (建構函式/清除/重設)。

現在有可用的專用內容,讓新程式使用它:

新程式使用新建立的內容。

備註:

  • getContext 方法必須嚴格實作,如下所示,使用委派至 ProgramContextStore類別的 getOrCreate 方法和自動有線 Spring BeanFactory。單一程式識別符用於在 中存放程式內容ProgramContextStore;此識別符被參考為「程式主要識別符」。

  • 必須使用@Import彈簧註釋參考配套組態和內容類別。

實作商業邏輯

當程式骨架完成時,請實作新公用程式的商業邏輯。

在程式的 run方法中執行此操作。此方法會在呼叫程式時執行,無論是透過其他程式或指令碼。

編碼愉快!

處理程式註冊

最後,請確定新的程式已在 中正確註冊ProgramRegistry。如果您已將新程式新增至已包含其他程式的套件,則無需再執行任何操作。新程式會在應用程式啟動時取得並註冊其所有鄰近程式。

如果您為程式選擇其他位置,則必須確保程式已在 Tomcat 啟動時正確註冊。如需有關如何執行此操作的一些啟發,請查看服務專案中產生之 SpringbootLauncher 類別的初始化方法 (請參閱服務專案內容)。

檢查 Tomcat 啟動日誌。每個程式註冊都會記錄。如果您的程式已成功註冊,您會找到相符的日誌項目。

當您確定您的程式已正確註冊時,您可以開始反覆運算商業邏輯編碼。

完整名稱映射

本節包含大型主機 AWS 轉換的清單,以及用於現代化應用程式的第三方完整名稱映射。

AWS 大型主機完整名稱映射的轉換

短名稱 完整名稱

CallBuilder

com.netfective.bluage.gapwalk.runtime.statements.CallBuilder

Configuration

com.netfective.bluage.gapwalk.datasimplifier.configuration.Configuration

ConfigurationBuilder

com.netfective.bluage.gapwalk.datasimplifier.configuration.ConfigurationBuilder

ExecutionController

com.netfective.bluage.gapwalk.rt.call.ExecutionController

ExecutionControllerImpl

com.netfective.bluage.gapwalk.rt.call.internal.ExecutionControllerImpl

File

com.netfective.bluage.gapwalk.rt.io.File

MainProgramRunner

com.netfective.bluage.gapwalk.rt.call.MainProgramRunner

Program

com.netfective.bluage.gapwalk.rt.provider.Program

ProgramContextStore

com.netfective.bluage.gapwalk.rt.context.ProgramContextStore

ProgramRegistry

com.netfective.bluage.gapwalk.rt.provider.ProgramRegistry

Record

com.netfective.bluage.gapwalk.datasimplifier.data.Record

RecordEntity

com.netfective.bluage.gapwalk.datasimplifier.entity.RecordEntity

RuntimeContext

com.netfective.bluage.gapwalk.rt.context.RuntimeContext

SimpleStateMachineController

com.netfective.bluage.gapwalk.rt.statemachine.SimpleStateMachineController

StateMachineController

com.netfective.bluage.gapwalk.rt.statemachine.StateMachineController

StateMachineRunner

com.netfective.bluage.gapwalk.rt.statemachine.StateMachineRunner

第三方完整名稱映射

短名稱 完整名稱

@Autowired

org.springframework.beans.factory.annotation.Autowired

@Bean

org.springframework.context.annotation.Bean

BeanFactory

org.springframework.beans.factory.BeanFactory

@Component

org.springframework.stereotype.Component

ConfigurableApplicationContext

org.springframework.context.ConfigurableApplicationContext

@Import

org.springframework.context.annotation.Import

@Lazy

org.springframework.context.annotation.Lazy