天天看點

在ABAP裡模拟實作Java Spring的依賴注入ABAP Summer依賴注入的實作原理

Dependency Injection- 依賴注入,在Java Spring架構中有着廣泛地應用。通過依賴注入,我們不必在應用代碼裡繁瑣地初始化依賴的資源,非常友善。

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

嘗試的場景

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

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

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

在ABAP裡模拟實作Java Spring的依賴注入ABAP Summer依賴注入的實作原理
自然的,我有一個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.      
在ABAP裡模拟實作Java Spring的依賴注入ABAP Summer依賴注入的實作原理

開關有個“按”的方法。按下之後,如果目前狀态是開,那麼就調用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.      
在ABAP裡模拟實作Java Spring的依賴注入ABAP Summer依賴注入的實作原理

總結一下,上圖代碼有哪些是在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 Summer依賴注入的實作原理

現在,怎樣用ABAP實作這些“魔術”?

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

在ABAP裡模拟實作Java Spring的依賴注入ABAP Summer依賴注入的實作原理

注意: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裡模拟實作Java Spring的依賴注入ABAP Summer依賴注入的實作原理
之前提到的這三處手動操作完全得到避免。GET_BEAN方法傳回的開關執行個體,裡面的成員變量mo_switchable包含的就是自動注入好的ZCL_LAMP類的執行個體。

line 8: 手工建立ZCL_LAMP(燈)的執行個體。

line 9: 手工建立ZCL_SWITCH(開關)的執行個體。

line 11: 調用set方法手動注入燈和開關的依賴關系。

讓我們再看看Java Spring裡正宗的消費代碼,確定我們發明的ABAP Summer确實是原汁原味的依賴注入。
————————————————
版權聲明:本文為CSDN部落客「汪子熙」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/i042416/article/details/81672438      
在ABAP裡模拟實作Java Spring的依賴注入ABAP Summer依賴注入的實作原理

ABAP Summer依賴注入的實作原理

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

https://github.com/i042416/jerryslide/tree/master/ABAP/summer
在ABAP裡模拟實作Java Spring的依賴注入ABAP Summer依賴注入的實作原理
在ABAP裡模拟實作Java Spring的依賴注入ABAP Summer依賴注入的實作原理