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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

在ABAP里模拟实现Java Spring的依赖注入相关推荐

  1. java spring getbean_spring依赖注入中获取JavaBean

    一.这个接口有什么用? 当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean.换句话说,就是这个类可以 ...

  2. java中四种注入注解,Spring中依赖注入的四种方式

    在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的sett ...

  3. 据说,80%的人没有真正理解了Spring的依赖注入

    前言 提起Spring,大家肯定不陌生,它是每一个Java开发者绕不过去的坎.Spring 框架为基于 java 的企业应用程序提供了一整套解决方案,方便开发人员在框架基础快速进行业务开发. 在官网中 ...

  4. spring(一)依赖注入与 SPEL

    Spring之依赖注入与 SPEL 一.控制反转与依赖注入 二.helloworld 三.构造注入 四.级联注入 五.单例与多例 六.工厂方法创建 Bean 七.包扫描管理 bean 八.SPEL与资 ...

  5. 什么是Spring的依赖注入?

    我们先看看什么叫依赖.在生活中,依靠别人或者别的事物而不能独立或者自立,我们称为依赖.那么在应用中,什么叫依赖呢? 依赖指的是两个实例之间的关系.其中一个实例是独立的,另一个实例是非独立的(依赖的), ...

  6. java什么是依赖注入_spring的依赖注入是什么意思

    最近学习spring框架,对依赖注入有些模糊,遂上网翻阅资料,做了下列总结,原博客为CSDN 南夏的 spring的依赖注入是什么意思,侵删! Spring 能有效地组织J2EE应用各层的对象.不管是 ...

  7. java什么是依赖注入_什么是依赖注入?

    转自 https://blog.csdn.net/coding_1994/article/details/80634810,这位作者写的很清晰. Spring 能有效地组织J2EE应用各层的对象.不管 ...

  8. factorybean 代理类不能按照类型注入_《Spring入门经典》:使用Spring进行依赖注入

    第二章:使用Spring进行依赖注入 重点:配置并使用Spring容器 使用不同类型的配置元数据来配置Spring容器 理解依赖解析 了解自动装配的优缺点 在容器中执行显式Bean查找 学习不同的Be ...

  9. Spring Setter依赖注入示例

    学习如何编写Spring Setter依赖注入示例 . Setter注入是Spring依赖注入的一种 . Spring支持字段注入,Setter注入以及构造函数注入,以将依赖项注入Spring托管的b ...

最新文章

  1. 机器大神 Michael Jordan 教授主题演讲:机器学习——创新视角,直面挑战》
  2. [BTS]使用BizTalk开发应用系统,就是这么简单!
  3. Linux操作(5)——创建硬链接与软链接
  4. mybatisplus坑 insert标签insert into select无参数问题
  5. js方法写在html中,在js中写html代码怎么写
  6. 算法洗脑系列(8篇)——第八篇 概率思想
  7. 疯狂Java学习笔记(72)-----------大话程序猿面试
  8. C++11 thread_local
  9. 杨辉三角程序(一步步优化)
  10. 同一个WiFi,电脑不能访问CSDN网站,手机却可以,换一个网络电脑就可以是什么原因?
  11. MTK 驱动 Kernel-3.18中如何配置和使用spi
  12. Photoshop常见疑问解答(转)
  13. 使用fiddler代理,手机无法上网
  14. 发邮件自动回复本机IP——python版本
  15. eclipse中的svn提交代码时文件上出现蓝色加号或者十字架时最笨但最有效的方法
  16. 乐动机器人 2D DTOF激光雷达 LD06、LD19驱动包开源仓库分享
  17. 2020 CES“高尖精”机器人回顾!
  18. 工具条Toolstrip应用
  19. [递推式求解、多指针、前缀和]XATU第七届算法大赛
  20. oracle修复工具下载,Oracle数据库恢复工具DataNumen Oracle Recovery

热门文章

  1. 第三次学JAVA再学不好就吃翔(part95)--Collections工具类
  2. 《复杂》读书笔记(part5)--复杂性度量
  3. 数字调制2ASK误码率分析matlab实现
  4. python如何运用到财务工作中存在的问题_财务工作存在问题及整改措施
  5. python调用api接口获取数据_python批量爬取NCBI基因注释并调用谷歌API批量翻译
  6. Chrome Elements 标签页 和 View Source 的显示为什么有差异
  7. 什么是 SAP vocabulary-based annotations
  8. SAP Spartacus B2B ListComponent响应回车事件的实现
  9. SAP Spartacus B2B页面的List Component
  10. tomcat使用manager GUI应用和script分别reload应用的注意事项