写点什么

在 ABAP 里模拟实现 Java Spring 的依赖注入

作者:Jerry Wang
  • 2021 年 12 月 03 日
  • 本文字数:1647 字

    阅读完需:约 5 分钟

在 ABAP 里模拟实现 Java Spring 的依赖注入

Dependency Injection- 依赖注入,在 Java Spring 框架中有着广泛地应用。通过依赖注入,我们不必在应用代码里繁琐地初始化依赖的资源,非常方便。


那么 ABAP 能否从语言层面上也支持依赖注入,享受这种设计思路带来的便利呢?让我们做一次尝试。

尝试的场景

在现实生活中,每一盏灯都有一个开关控制。按下开关,灯被打开;再按一次,灯熄灭。


先看不使用依赖注入的常规实现:


设计一个 ABAP interface ZIF_SWITCHABLE,提供两个方法,分别对应开和关。



自然的,我有一个 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 这个接口。



开关有个“按”的方法。按下之后,如果当前状态是开,那么就调用 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 Summer 框架的消费代码

从下图的代码能看出,ZCL_SWITCH 和 ZCL_LAMP 产生了强依赖关系。这种依赖关系是应用开发人员调用 set 方法手动注入的。



总结一下,上图代码有哪些是在 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 实现这些“魔术”?


1. 在 ZCL_SWITCH 类的成员变量 mo_switchable 的描述字段里加上注解 @Inject,意图是告诉 ABAP Summer 框架,我希望 mo_switchable 成员能够自动被注入一个正确的依赖进来。到底什么样的依赖算正确?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 常规实现和基于 ABAP 依赖注入思想的两套消费代码的比较,能清晰发现,采取了 ABAP 依赖注入后,



之前提到的这三处手动操作完全得到避免。GET_BEAN 方法返回的开关实例,里面的成员变量 mo_switchable 包含的就是自动注入好的 ZCL_LAMP 类的实例。


line 8: 手工创建 ZCL_LAMP(灯)的实例。


line 9: 手工创建 ZCL_SWITCH(开关)的实例。


line 11: 调用 set 方法手动注入灯和开关的依赖关系。


让我们再看看 Java Spring 里正宗的消费代码,确保我们发明的 ABAP Summer 确实是原汁原味的依赖注入。


ABAP Summer 依赖注入的实现原理

这个 ABAP 依赖注入框架的实现在我的 github 上:


https://github.com/i042416/jerryslide/tree/master/ABAP/summer



关于 Java Spring 依赖注入的讲解,网上有很多写得很精彩的著作。



下面是 ABAP Summer 依赖注入的核心实现,参考了上图著作关于 Java Spring 的讲解。



要获取更多 Jerry 的原创技术文章,请关注公众号"汪子熙"。

发布于: 3 小时前阅读数: 7
用户头像

Jerry Wang

关注

个人微信公众号:汪子熙 2017.12.03 加入

SAP成都研究院开发专家,SAP社区导师,SAP中国技术大使。

评论

发布
暂无评论
在 ABAP 里模拟实现 Java Spring 的依赖注入