spring boot 中如何优雅的使用自动注入实现策略模式

文章讲述了如何利用Spring框架的自动注入功能和策略模式,实现在运行时动态决定调用哪个PayService接口的实现类。通过Set存储服务实例,Map映射渠道号到服务,`@Autowired`和`@PostConstruct`确保了初始化过程的正确执行。
摘要由CSDN通过智能技术生成

前言

关系说明:PayService为支付接口,核心业务方法为epay(),该接口有好几个不同的实现类。
需求:在运行时需要动态决定走哪个实现类的逻辑。

解决方案

先上成品代码:

@Service
public class RouteService {
 
    @Autowired
    Set<PayService> payServiceSet;
    
    Map<String, PayService> payServiceMap;
 
    public PayResult epay(PayRequest payRequest) {
        PayService payService = payServiceMap.get(payRequest.getChannelNo());
        return  payService.epay(payRequest);
    }
 
    @PostConstruct
    public void init() {
        for (PayService payService : payServiceSet) {
            payServiceMap = new HashMap<>();
            payServiceMap.put(payService.channel(), payService);
        }
    }
}

代码分析

使用Set<PayService>类型会使Spring将所有实现了PayService接口的类都注入进Set中。

@Autowired
Set<PayService> payServiceSet;

Map<String, PayService>用于保存实现类与调用判断逻辑之间的映射关系。

Map<String, PayService> payServiceMap;

使用@PostConstruct注解修饰的init方法会在Spring容器的启动时自动的执行,在其中完成映射Map的构建。
其中的payService的channel()方法来自于接口定义,PayService接口要求每个实现类都实现该方法,该方法会返回不同实现类的唯一标识符。

@PostConstruct
public void init() {
    for (PayService payService : payServiceSet) {
        payServiceMap = new HashMap<>();
        payServiceMap.put(payService.channel(), payService);
    }
}

在调用时,请求参数中必须携带一个唯一标识符,用以表明本次调用需要走哪个实现类,也就是上述映射Map中的Key的值。

public PayResult epay(PayRequest payRequest) {
   PayService payService = payServiceMap.get(payRequest.getChannelNo());
   return  payService.epay(payRequest);
}

参考文章

巧用 Spring 自动注入快速实现策略模式

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值