首頁  >  文章  >  Java  >  如何在ABAP裡模擬實現Java Spring的依賴注入(圖文)

如何在ABAP裡模擬實現Java Spring的依賴注入(圖文)

不言
不言轉載
2018-10-22 16:09:112394瀏覽

這篇文章帶給大家的內容是關於如何在ABAP裡模擬實現Java Spring的依賴注入(圖文) ,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

Dependency Injection- 依賴注入,在Java Spring框架中有廣泛地應用。透過依賴注入,我們不必在應用程式碼裡繁瑣地初始化依賴的資源,非常方便。

那麼ABAP能否從語言層面也支持依賴注入,享受這種設計思維帶來的便利呢?讓我們做一次嘗試。

嘗試的場景

在現實生活中,每一盞燈都有一個開關控制。按下開關,燈被打開;再按一次,燈熄滅。

先看不使用依賴注入的常規實作:

設計一個ABAP interface ZIF_SWITCHABLE,提供兩個方法,分別對對應開和關。

如何在ABAP裡模擬實現Java Spring的依賴注入(圖文)

自然的,我有一個ABAP 類別 ZCL_LAMP,用於實作上述介面。每個ZCL_LAMP的實例就是一盞燈。

CLASS ZCL_LAMP IMPLEMENTATION.
method ZIF_SWITCHABLE~OFF.
WRITE: / 'lamp off'.
endmethod.
method ZIF_SWITCHABLE~ON.
WRITE: / 'lamp on'.
endmethod.
ENDCLASS.

再設計一個開關類,這個類別有一個成員變數mo_switchable, 指向ZIF_SWITCHABLE這個介面。

如何在ABAP裡模擬實現Java Spring的依賴注入(圖文)

開關有個「按」的方法。按下之後,如果目前狀態是開,那麼就呼叫mo_switchable成員的off方法,將其關閉,並設定開關狀態為關閉。反之亦然。

METHOD push.
IF isswitchon = abap_true.
mo_switchable->off( ).
isswitchon = abap_false.
ELSE.
mo_switchable->on( ).
isswitchon = abap_true.
ENDIF.
ENDMETHOD.

提供一個setter方法,將傳入的型別為ZIF_SWITCHABLE的變數注入到成員變數mo_switchable。

method SET_SWITCHABLE.

mo_switchable = io_switchable.

endmethod.

我把目前創建的兩個類別:ZCL_LAMP和ZCL_SWITCH都放到package $ZDEV_INVERSION內。

如何在ABAP裡模擬實現Java Spring的依賴注入(圖文)

ABAP Summer框架的消費碼

從下圖的程式碼能看出,ZCL_SWITCH和ZCL_LAMP產生了強依賴關係。這種依賴關係是應用開發人員呼叫set方法手動注入的。

如何在ABAP裡模擬實現Java Spring的依賴注入(圖文)

總結一下,上圖程式碼有哪些是在Java Spring裡完全能夠透過依賴注入的想法來避免的。

line 8: 手動建立ZCL_LAMP(燈)的實例。

line 9: 手動建立ZCL_SWITCH(開關)的實例。

line 11: 呼叫set方法手動注入燈和開關的依賴關係。

使用ABAP Summer框架實作依賴注入

我自己用ABAP模擬了Java Spring的依賴注入框架,開發了一個原型,取名為ABAP Summer,與Java的Spring相呼應。

先想想這個簡單的例子要用Java Spring如何實作。一個Java程式設計師很容易就能寫出下面的程式碼,利用Spring的註解@Inject,我們不需要手動實例化ISwitchable和呼叫set方法建立依賴。一切由Spring框架幫我們實現了。

如何在ABAP裡模擬實現Java Spring的依賴注入(圖文)

現在,怎麼能用ABAP實現這些「魔術」?

1. 在ZCL_SWITCH類別的成員變數mo_switchable的描述欄位裡加上註解@Inject,意圖是告訴ABAP Summer框架,我希望mo_switchable成員能夠自動被注入一個正確的依賴進來。到底是什麼樣的依賴算正確? Summer框架如何知道該如何注入?請繼續閱讀。

如何在ABAP裡模擬實現Java Spring的依賴注入(圖文)

注意:ABAP這門語言同Java不同,無法在語言層面支援註解,因此這裡在Description欄位上維護的@Inject只是一個模擬。

2. 先看採用了依賴注入之後的ABAP消費程式碼,是不是一下子就清爽了很多?

data(summer) = zcl_summer=>get_instance( ).
data(lo_switch) = cast zcl_switch( summer->get_bean( EXPORTING iv_bean_name = 'ZCL_SWITCH' ) ).
lo_switch->push( ).
lo_switch->push( ).

下圖是基於ABAP常規實現和基於ABAP依賴注入思想的兩套消費代碼的比較,能清晰發現,採取了ABAP依賴注入後,

如何在ABAP裡模擬實現Java Spring的依賴注入(圖文)

之前提到的這三個手動操作完全得到避免。 GET_BEAN方法回傳的開關實例,裡面的成員變數mo_switchable包含的就是自動注入好的ZCL_LAMP類別的實例。

line 8: 手動建立ZCL_LAMP(燈)的實例。

line 9: 手動建立ZCL_SWITCH(開關)的實例。

line 11: 呼叫set方法手動注入燈和開關的依賴關係。

讓我們再看看Java Spring裡正宗的消費程式碼,確保我們發明的ABAP Summer確實是原汁原味的依賴注入。

如何在ABAP裡模擬實現Java Spring的依賴注入(圖文)

ABAP Summer依賴注入的實作原理

這個ABAP依賴注入框架的實作在我的github上:

https://github.com/i042416/je...

如何在ABAP裡模擬實現Java Spring的依賴注入(圖文)

關於Java Spring依賴注入的講解,網路上有很多寫得很精彩的著作。

如何在ABAP裡模擬實現Java Spring的依賴注入(圖文)

以下是ABAP Summer依賴注入的核心實現,參考了上圖著作關於Java Spring的講解。

如何在ABAP裡模擬實現Java Spring的依賴注入(圖文)

#

以上是如何在ABAP裡模擬實現Java Spring的依賴注入(圖文)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除