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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:
相关推荐
本文档主要介绍了如何在SAP ABAP系统与JAVA应用程序之间通过RFC(Remote Function Call远程函数调用)实现数据交互的具体实现方法。核心需求是在给定特定的选择条件下,从SAP系统的数据库表T001中提取数据,并将这些...
【SAP ABAP调用Java生成的Web Service手册】 在SAP系统中,与外部服务进行...通过以上步骤,你可以在SAP ABAP环境中成功调用由Java生成的Web Service。这不仅扩展了SAP的功能,也实现了不同系统间的集成和数据交换。
Java与SAP ABAP之间的通信主要通过Remote Function Call (RFC)接口实现,这是一种标准化的方式,允许不同系统间的双向数据交换。在本项目中,我们使用了JCo3(Java Connector version 3)库,它是SAP提供的Java API...
在IT领域,尤其是在企业级应用开发中,Java和ABAP(Advanced Business Application Programming)是两种常用的编程语言。Java广泛应用于互联网应用,而ABAP则是SAP系统的核心编程语言。为了实现不同系统的集成和数据...
- **声明与实现分离**:在ABAP中,类的声明和实现是分开的,这与Java中的类定义风格略有不同。 - **示例对比**:例如,在Java中定义一个账户类(`Account`),而在ABAP中同样定义一个账户类(`account`),两者在...
标题中的“ABAP-AES-JAVA加密解密”是指在ABAP和JAVA两个不同的编程环境中实现AES(Advanced Encryption Standard)加密算法的互操作性。AES是一种广泛应用的块密码标准,用于保护数据的安全,确保信息不被未经授权...
3. **定义实现接口**:在实现界面中,同样需要选择“Interface”,然后指定实现接口(例如`ZIF_EX_TEST`)。 4. **编写实现代码**:在实现类中编写具体的逻辑。这通常涉及定义实现类的方法,这些方法必须与定义的...
在描述中提到的博文链接,虽然无法直接访问,但通常博主会分享如何在ABAP编程中实现BOM的层次遍历和展示。这可能包括以下几种方法: 1. **递归查询**:通过在数据库层面使用递归SQL查询,逐级获取BOM的子组件,然后...
在IT领域,尤其是在企业应用开发中,Java与ABAP(Advanced Business Application Programming)的交互是常见的需求。ABAP是SAP公司的主要编程语言,而Java作为一种广泛使用的通用编程语言,两者之间的互操作性对于...
ABAP代码实现的模拟退火算法,具体demo见文章
ABAP实现F4帮助联动 ...4. 在实现F4帮助联动功能时,需要定义数据结构来存储搜索结果,并使用条件语句来过滤搜索结果。 5. 在SAP ABAP系统中,F4帮助联动功能可以提高用户的工作效率,提高系统的整体性能。
abap alv报表实现消消乐小游戏
在本文中,我们将深入探讨如何在ABAP环境中发布Web服务以及如何使用Java进行调用。Web服务是一种标准的接口,允许不同系统间进行数据交换。在SAP系统中,ABAP是主要的编程语言,我们可以使用它来创建和发布Web服务。...
在本章节中,我们将介绍 SAP ABAP 开发环境和开发工具,包括 ABAP WORKBENCH、ADT 和其他开发工具的介绍。 ABAP WORKBENCH 介绍 ABAP WORKBENCH 是 SAP 系统中最常用的开发环境之一,它提供了一个集成的开发环境,...
本文将详细介绍如何使用面向对象编程(Object-Oriented Programming,OOP)在SAP ABAP中实现ALV框的可编辑功能。 首先,我们需要定义一个事件接收器类(Event Receiver Class),用于处理ALV框中的事件。在这个类中...
然而,随着面向对象编程(OO)概念在SAP中的推广,ABAP也引入了一系列面向对象的ALV实现机制。这种方式不仅提供了更灵活的编程接口,还增强了代码的可读性和可维护性。 #### 二、面向对象的ALV实现 面向对象的ALV...
ABAP的另一个显著特性是其跨平台性,类似于Java,ABAP程序可以在任何操作系统上运行,兼容多种数据库,并能在不同的网络系统中无缝运行。ABAP字典实现了透明表的概念,使得开发者在ABAP层面上操作的表与底层数据库...
在SAP系统中,ABAP调用ABAP Proxy是一种常见的技术操作,用于在不同系统间或者同一系统内的组件之间实现通信。ABAP Proxy是SAP提供的一个强大的接口技术,它允许开发者创建安全、高效的远程调用机制。接下来,我们将...