if else太多怎么代替,太难维护?可以使用spring-plugin 插件系统

一、springboot +spring-plugin

二、针对根据入参不同可能有不同实现逻辑的场景写个demo,如:针对支付宝或者微信支付渠道发起的支付请求

1).引入相关依赖

        <dependency>
            <groupId>org.springframework.plugin</groupId>
            <artifactId>spring-plugin-core</artifactId>
        </dependency>

 

2).请求参数实体属性

@Data
public class PayRequestVO {

    private String channel;
    
    private String phone;
    
    private BigDecimal money;
}

 

支付接口:

public interface OrderPayOperationService extends Plugin<PayRequestVO> {

    public String orderPay(PayRequestVO vo);
}

支付宝支付实现:

@Service
public class AlipayOrderPayOperationServiceImpl implements OrderPayOperationService {

    @Override
    public boolean supports(PayRequestVO delimiter) {
        return "alipay".equalsIgnoreCase(delimiter.getChannel());
    }

    @Override
    public String orderPay(PayRequestVO vo) {
        return "支付宝支付";
    }

}

微信支付实现:

@Service
public class WxOrderPayOperationServiceImpl implements OrderPayOperationService {

    @Override
    public boolean supports(PayRequestVO delimiter) {
        return false;
    }

    @Override
    public String orderPay(PayRequestVO vo) {
        return "微信支付";
    }

}

将业务接口注入到插件系统:@EnablePluginRegistries({ OrderPayOperationService.class })

test:

@SpringBootApplication //Spring Boot核心注解,用于开启自动配置
@EnablePluginRegistries({ OrderPayOperationService.class })
@Slf4j
public class DemoApplication {
    //程序可以直接在此启动

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(DemoApplication.class, args);

        PluginRegistry<OrderPayOperationService, PayRequestVO> orderPayOperationServicePluginRegistry = (PluginRegistry<OrderPayOperationService, PayRequestVO>) context
                .getBean("orderPayOperationServiceRegistry");
        PayRequestVO vo = new PayRequestVO();
        vo.setChannel("alipay");
        vo.setPhone("1231231231");
        vo.setMoney(new BigDecimal(100));
        //获取插件
        OrderPayOperationService orderPayOperationService = orderPayOperationServicePluginRegistry.getPluginFor(vo);//getPlugins();
        //发起订单支付
        String orderPay = orderPayOperationService.orderPay(vo);
        log.info("支付返回:{}", orderPay);
    }

}

运行结果:

 

 总结:

1.使用spring-plugin可以方便代码拓展功能,方便维护;

2.架构清晰,结构分层;

3.业务实现解耦,保持原有业务稳定性,新增业务无需动到框架层面.

参考:https://blog.csdn.net/u010192145/article/details/90487058

 

posted @ 2020-06-24 12:29  宇枫  阅读(828)  评论(1编辑  收藏  举报