摘要:依賴注入,在框架中有著廣泛地應(yīng)用。這種依賴關(guān)系是應(yīng)用開(kāi)發(fā)人員調(diào)用方法手動(dòng)注入的。總結(jié)一下,上圖代碼有哪些是在里完全能夠通過(guò)依賴注入的思想來(lái)避免的。讓我們?cè)倏纯蠢镎诘南M(fèi)代碼,確保我們發(fā)明的確實(shí)是原汁原味的依賴注入。
Dependency Injection- 依賴注入,在Java Spring框架中有著廣泛地應(yīng)用。通過(guò)依賴注入,我們不必在應(yīng)用代碼里繁瑣地初始化依賴的資源,非常方便。
那么ABAP能否從語(yǔ)言層面上也支持依賴注入,享受這種設(shè)計(jì)思路帶來(lái)的便利呢?讓我們做一次嘗試。
嘗試的場(chǎng)景在現(xiàn)實(shí)生活中,每一盞燈都有一個(gè)開(kāi)關(guān)控制。按下開(kāi)關(guān),燈被打開(kāi);再按一次,燈熄滅。
先看不使用依賴注入的常規(guī)實(shí)現(xiàn):
設(shè)計(jì)一個(gè)ABAP interface ZIF_SWITCHABLE,提供兩個(gè)方法,分別對(duì)應(yīng)開(kāi)和關(guān)。
自然的,我有一個(gè)ABAP 類(lèi) ZCL_LAMP,用于實(shí)現(xiàn)上述接口。每個(gè)ZCL_LAMP的實(shí)例就是一盞燈。
CLASS ZCL_LAMP IMPLEMENTATION. method ZIF_SWITCHABLE~OFF. WRITE: / "lamp off". endmethod. method ZIF_SWITCHABLE~ON. WRITE: / "lamp on". endmethod. ENDCLASS.
再設(shè)計(jì)一個(gè)開(kāi)關(guān)類(lèi),這個(gè)類(lèi)有一個(gè)成員變量mo_switchable, 指向ZIF_SWITCHABLE這個(gè)接口。
開(kāi)關(guān)有個(gè)“按”的方法。按下之后,如果當(dāng)前狀態(tài)是開(kāi),那么就調(diào)用mo_switchable成員的off方法,將其關(guān)閉,并設(shè)置開(kāi)關(guān)狀態(tài)為關(guān)閉。反之亦然。
METHOD push. IF isswitchon = abap_true. mo_switchable->off( ). isswitchon = abap_false. ELSE. mo_switchable->on( ). isswitchon = abap_true. ENDIF. ENDMETHOD.
提供一個(gè)setter方法,將傳入的類(lèi)型為ZIF_SWITCHABLE的變量注入到成員變量mo_switchable中。
method SET_SWITCHABLE. mo_switchable = io_switchable. endmethod.
我把迄今為止創(chuàng)建的兩個(gè)類(lèi):ZCL_LAMP和ZCL_SWITCH都放到package $ZDEV_INVERSION內(nèi)。
ABAP Summer框架的消費(fèi)代碼從下圖的代碼能看出,ZCL_SWITCH和ZCL_LAMP產(chǎn)生了強(qiáng)依賴關(guān)系。這種依賴關(guān)系是應(yīng)用開(kāi)發(fā)人員調(diào)用set方法手動(dòng)注入的。
總結(jié)一下,上圖代碼有哪些是在Java Spring里完全能夠通過(guò)依賴注入的思想來(lái)避免的。
line 8: 手工創(chuàng)建ZCL_LAMP(燈)的實(shí)例。
line 9: 手工創(chuàng)建ZCL_SWITCH(開(kāi)關(guān))的實(shí)例。
line 11: 調(diào)用set方法手動(dòng)注入燈和開(kāi)關(guān)的依賴關(guān)系。
使用ABAP Summer框架實(shí)現(xiàn)依賴注入我自己用ABAP模擬了Java Spring的依賴注入框架,開(kāi)發(fā)了一個(gè)原型,取名ABAP Summer,與Java的Spring相呼應(yīng)。
先想想這個(gè)簡(jiǎn)單的例子用Java Spring如何實(shí)現(xiàn)。一個(gè)Java程序員很容易就能寫(xiě)出下面的代碼,利用Spring的注解@Inject,我們無(wú)需手動(dòng)實(shí)例化ISwitchable和調(diào)用set方法建立依賴。一切由Spring框架幫我們實(shí)現(xiàn)了。
現(xiàn)在,怎樣用ABAP實(shí)現(xiàn)這些“魔術(shù)”?
1. 在ZCL_SWITCH類(lèi)的成員變量mo_switchable的描述字段里加上注解@Inject,意圖是告訴ABAP Summer框架,我希望mo_switchable成員能夠自動(dòng)被注入一個(gè)正確的依賴進(jìn)來(lái)。到底什么樣的依賴算正確?Summer框架如何知道該怎樣注入?請(qǐng)繼續(xù)閱讀。
注意:ABAP這門(mén)語(yǔ)言同Java不同,無(wú)法在語(yǔ)言層面支持注解,因此這里在Description字段上維護(hù)的@Inject只是一個(gè)模擬。
2. 先看采用了依賴注入之后的ABAP消費(fèi)代碼,是不是一下子清爽了很多?
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常規(guī)實(shí)現(xiàn)和基于ABAP依賴注入思想的兩套消費(fèi)代碼的比較,能清晰發(fā)現(xiàn),采取了ABAP依賴注入后,
之前提到的這三處手動(dòng)操作完全得到避免。GET_BEAN方法返回的開(kāi)關(guān)實(shí)例,里面的成員變量mo_switchable包含的就是自動(dòng)注入好的ZCL_LAMP類(lèi)的實(shí)例。
line 8: 手工創(chuàng)建ZCL_LAMP(燈)的實(shí)例。
line 9: 手工創(chuàng)建ZCL_SWITCH(開(kāi)關(guān))的實(shí)例。
line 11: 調(diào)用set方法手動(dòng)注入燈和開(kāi)關(guān)的依賴關(guān)系。
讓我們?cè)倏纯碕ava Spring里正宗的消費(fèi)代碼,確保我們發(fā)明的ABAP Summer確實(shí)是原汁原味的依賴注入。
ABAP Summer依賴注入的實(shí)現(xiàn)原理這個(gè)ABAP依賴注入框架的實(shí)現(xiàn)在我的github上:
https://github.com/i042416/je...
關(guān)于Java Spring依賴注入的講解,網(wǎng)上有很多寫(xiě)得很精彩的著作。
下面是ABAP Summer依賴注入的核心實(shí)現(xiàn),參考了上圖著作關(guān)于Java Spring的講解。
要獲取更多Jerry的原創(chuàng)技術(shù)文章,請(qǐng)關(guān)注公眾號(hào)"汪子熙"或者掃描下面二維碼:
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71786.html
摘要:去年月定下的一年之內(nèi)學(xué)會(huì)自由泳的目標(biāo)終于實(shí)現(xiàn)了,特來(lái)還愿。和蛙泳和自由泳?;蛟S有的朋友覺(jué)得這兩組概念風(fēng)馬牛不相及,然而在眼中,之于相當(dāng)于蛙泳之于自由泳。像前面介紹過(guò)的和擁有五花八門(mén)的工具一樣,蛙泳和自由泳也有著眾多變式。 去年7月定下的一年之內(nèi)學(xué)會(huì)自由泳的目標(biāo)終于實(shí)現(xiàn)了,特來(lái)還愿。 ABAP和Java,?蛙泳和自由泳。前面的組合是Jerry用來(lái)掙錢(qián)養(yǎng)家的技術(shù),后者是Jerry花了大量業(yè)...
摘要:動(dòng)態(tài)代理有多種不同的用途,例如,數(shù)據(jù)庫(kù)連接和事務(wù)管理用于單元測(cè)試的動(dòng)態(tài)模擬對(duì)象其他類(lèi)似的方法攔截。調(diào)用序列和下面的流程類(lèi)似單元測(cè)試動(dòng)態(tài)對(duì)象模擬利用動(dòng)態(tài)代理實(shí)現(xiàn)單元測(cè)試的動(dòng)態(tài)存根代理和代理??蚣馨寻b成動(dòng)態(tài)代理。 使用反射可以在運(yùn)行時(shí)動(dòng)態(tài)實(shí)現(xiàn)接口。這可以使用類(lèi)java.lang.reflect.Proxy。這個(gè)類(lèi)的名稱是我將這些動(dòng)態(tài)接口實(shí)現(xiàn)稱之為動(dòng)態(tài)代理的原因。動(dòng)態(tài)代理有多種不同的用途,...
摘要:時(shí)間年月日星期六說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。慕課網(wǎng)教學(xué)源碼學(xué)習(xí)源碼第一章課程介紹課程簡(jiǎn)介是啥讀音是輕量級(jí)的依賴注入框架說(shuō)明一個(gè)的框架需要有基礎(chǔ)什么是剝離注入輕量級(jí)代碼少易維護(hù)性能優(yōu)異,跟比較。 時(shí)間:2017年10月14日星期六說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com 教學(xué)源碼:https://github.com/zccodere/s......
摘要:之旅簡(jiǎn)化開(kāi)發(fā)的使命簡(jiǎn)化開(kāi)發(fā)為了降低開(kāi)發(fā)的復(fù)雜性,采取如下關(guān)鍵策略基于的輕量級(jí)和最小侵入性編程通過(guò)依賴注入和面向接口實(shí)現(xiàn)松耦合基于切面和慣例進(jìn)行聲明式編程通過(guò)切面和模版減少樣式代碼依賴注入耦合性具有兩面性一方面,緊密耦合的代碼難以測(cè)試難以復(fù) Spring之旅 簡(jiǎn)化Java開(kāi)發(fā) Spring的使命:簡(jiǎn)化Java開(kāi)發(fā) 為了降低Java開(kāi)發(fā)的復(fù)雜性,采取如下關(guān)鍵策略:基于POJO的輕量級(jí)和最...
摘要:在以下簡(jiǎn)稱和以下簡(jiǎn)稱開(kāi)發(fā)團(tuán)隊(duì)都工作過(guò),這篇文章給出這兩款產(chǎn)品一些技術(shù)層面的比較。標(biāo)準(zhǔn)開(kāi)發(fā)方式和的雖然看起來(lái)都是風(fēng)格,但實(shí)現(xiàn)技術(shù)不同。而的標(biāo)準(zhǔn)則是基于和協(xié)作而成的。 如果您對(duì)SAP S/4HANA for Customer Management(以下簡(jiǎn)稱S4CRM)和SAP Cloud for Customer(以下簡(jiǎn)稱C4C)不甚熟悉,那我建議您可以先瀏覽我之前寫(xiě)的這兩篇微信公眾號(hào)文章...
閱讀 2203·2023-04-25 19:06
閱讀 1408·2021-11-17 09:33
閱讀 1794·2019-08-30 15:53
閱讀 2616·2019-08-30 14:20
閱讀 3576·2019-08-29 12:58
閱讀 3575·2019-08-26 13:27
閱讀 533·2019-08-26 12:23
閱讀 516·2019-08-26 12:22