【面向接口编程(IOP)典型场景】底层组件如何实现回调关照上层应用系统?

[复制链接]
发表于 2025-8-24 17:56:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本文介绍了在账务插件开辟中,如何通过“面向接口编程”实现异步转账完成后的回调关照机制。通过定义回调接口 TransferCallback,账务组件在异步操作完成后可关照上层应用举行后续业务处置惩罚。文章提供了纯 Java 和 Spring 两种实现方式的代码示例,展示了接口在插件化架构中的紧张作用,体现了面向接口编程在解耦与扩展方面的上风。


我们在开辟一个账务插件(sby-plugin-accounting),将账户的充、转、提等记账功能举行封装,实现复用。
其中,为了提高程序性能,针对账户转账的记账,使用了异步处置惩罚:转出账户的扣款在工作线程中执行,而转入账户的入账则采用异步的方式。
那么,现在问题来了,当异步转账完成后,如何关照上层应用层?
没错,达芬奇密码是:面向接口编程(Interface-Oriented Programming, IOP)。通过接口定义插件左券,这是在插件化架构中典型的解决方案。————异步转账完成后,依赖回调接口。上层应用系统假如需要关注异步转账完成的结果,则实现回调接口,举行特定的业务处置惩罚。
下面我们列举关键代码,来阐明如何基于OOP的IOP思想,通过回调接口实现记账完成的回调关照。下图程序结构是个demo,其中,子包 biz代表上层应用系统的业务逻辑,component 代表底层账务组件;主包 componentdemo、componentdemospring代表纯java版、spring版这两种实现方式。

🍀纯java版

1. 插件层

●插件中的回调接口TransferCallback

TransferCallback是一个interface类,定义了一个方法onTransferSuccess,这是该插件与上层应用系统建立逻辑关系的纽带。插件中的异步转账调用这个interface,上层应用系统按需实现这个interface。
  1. package jstudy.componentdemo.component;
  2. public interface TransferCallback {
  3.     void onTransferSuccess();
  4. }
复制代码
●插件中的转账服务类AccountTransferService

下面AccountTransferService是账务转账服务类(记账逻辑均为表示代码)。其中,

  • 定义了TransferCallback字段,并对外袒露了setter操作;
  • 在accountingForTos方法中依赖了这个字段的实例,达到转账完成后举行回调关照的目的。
  1. package jstudy.componentdemo.component;
  2. // 转账记账service
  3. @Slf4j
  4. public class AccountTransferService {
  5.     private AccountingService accountingService = new AccountingService();
  6.     @Setter
  7.     private TransferCallback transferCallback;
  8.     private static final Executor threadPool = ...;
  9.     public void accounting(AccountTransfer accountTransfer) {
  10.         log.info("转账记账开始");
  11.         AccountingRequest accountingRequest = new AccountingRequest(accountTransfer.getTransferOrderNo(), accountTransfer.getFrom(), accountTransfer.getTransferAmount(), true);
  12.         accountingService.accounting(accountingRequest);
  13.         // 通过异步为转账的收款方入账
  14.         threadPool.execute(() -> {
  15.             accountingForTos(accountTransfer);
  16.         });
  17.     }
  18.     private void accountingForTos(AccountTransfer accountTransfer) {
  19.         var listTo = accountTransfer.getTos();// 收款方集合
  20.         for (var entry: listTo.entrySet()) {
  21.             AccountingRequest accountingRequest = new AccountingRequest(accountTransfer.getTransferOrderNo(), entry.getKey(), entry.getValue(), false);
  22.             accountingService.accounting(accountingRequest);
  23.         }
  24.         boolean isImplementTransferCallback = transferCallback != null;
  25.         log.info("上层应用是否实现了转账回调:{}", isImplementTransferCallback);
  26.         if (isImplementTransferCallback) {
  27.             transferCallback.onTransferSuccess();
  28.         }
  29.     }
  30. }
复制代码
2. 上层应用层

下面TransferOrderService是应用层的 转账单service 类。该类同时实现了TransferCallback接口。
关键的控制在它的构造器中,决定是否要开启转账完成关照。
  1. // 业务转账单service
  2. @Slf4j
  3. public class TransferOrderService implements TransferCallback {
  4.     private AccountTransferService accountTransferService;
  5.     public TransferOrderService() {
  6.         accountTransferService = new AccountTransferService();
  7. //        accountTransferService.setTransferCallback(this);//是否开启转账完成通知
  8.     }
  9.     public void transfer() {
  10.         log.info("转账单记账");
  11.         AccountTransfer accountTransfer = new AccountTransfer();
  12.         accountTransfer.setTransferOrderNo("T202508000001")
  13.                 .setFrom("A")
  14.                 .setTransferAmount(50.00);
  15.         accountTransfer.setTos(ImmutableMap.of(
  16.                 "B", 10.00,
  17.                 "C", 40.00));
  18.         accountTransferService.accounting(accountTransfer);
  19.     }
  20.     @Override
  21.     public void onTransferSuccess() {
  22.         log.info("=========当前是在应用层,进行转账完成后的业务处理");
  23.         log.info("=========已向收款人发送到账通知短消息");
  24.     }
  25. }
复制代码
程序运行结果


  • 开启了转账完成回调
  1. 08:58:49.927 [j.c.biz.TransferOrderService] - 转账单记账
  2. 08:58:49.935 [j.c.component.AccountTransferService] - 转账记账开始
  3. 08:58:49.938 [j.c.component.AccountingService] - AccountingService->记账完成. 业务单号=T202508000001, accountNo=A, amount=50.00
  4. 08:58:49.949 [j.c.component.AccountingService] - AccountingService->记账完成. 业务单号=T202508000001, accountNo=B, amount=-10.00
  5. 08:58:49.949 [j.c.component.AccountingService] - AccountingService->记账完成. 业务单号=T202508000001, accountNo=C, amount=-40.00
  6. 08:58:49.949 [j.c.component.AccountTransferService] - 上层应用是否实现了转账回调:true
  7. 08:58:49.949 [j.c.biz.TransferOrderService] - =========当前是在应用层,进行转账完成后的业务处理
  8. 08:58:49.949 [j.c.biz.TransferOrderService] - =========已向收款人发送到账通知短消息
复制代码

  • 未开启转账完成回调
  1. 08:58:49.927 [j.c.biz.TransferOrderService] - 转账单记账
  2. 08:58:49.935 [j.c.component.AccountTransferService] - 转账记账开始
  3. 08:58:49.938 [j.c.component.AccountingService] - AccountingService->记账完成. 业务单号=T202508000001, accountNo=A, amount=50.00
  4. 08:58:49.949 [j.c.component.AccountingService] - AccountingService->记账完成. 业务单号=T202508000001, accountNo=B, amount=-10.00
  5. 08:58:49.949 [j.c.component.AccountingService] - AccountingService->记账完成. 业务单号=T202508000001, accountNo=C, amount=-40.00
  6. 08:58:49.949 [j.c.component.AccountTransferService] - 上层应用是否实现了转账回调:false
复制代码

🍀spring版

1. 插件层

●插件中的转账服务类AccountTransferService

下面AccountTransferService是账务转账服务类。通过@Autowired(required = false)来注入TransferCallback实例。
  1. package jstudy.componentdemo.component;
  2. // 转账记账service
  3. @Service
  4. @Slf4j
  5. public class AccountTransferService {
  6.     @Autowired
  7.     private AccountingService accountingService;
  8.     @Autowired(required = false)
  9.     private TransferCallback transferCallback;
  10.     public void accounting(AccountTransfer accountTransfer) {
  11.         ...
  12.         // 通过异步为转账的收款方入账
  13.         threadPool.execute(() -> {
  14.             accountingForTos(accountTransfer);
  15.         });
  16.     }
  17.     private void accountingForTos(AccountTransfer accountTransfer) {
  18.         ...
  19.         if (isImplementTransferCallback) {
  20.             transferCallback.onTransferSuccess();
  21.         }
  22.     }
  23. }
复制代码
2. 上层应用层

下面TransferOrderService是应用层的 转账单service 类。
由于该类是由 spring 容器托管的 bean,并且实现了TransferCallback接口,因此,这表示开启了转账完成的回调关照。
假如不开启,则不实现TransferCallback接口即可。
  1. // 业务转账单service
  2. @Service
  3. @Slf4j
  4. public class TransferOrderService implements TransferCallback {
  5.     @Autowired
  6.     private AccountTransferService accountTransferService;
  7.     public void transfer() {
  8.         ...
  9.     }
  10.     @Override
  11.     public void onTransferSuccess() {
  12.         ...
  13.     }
  14. }
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表