如何优雅的处理SpringBoot中的多个实现类

本文探讨了在SpringBoot中如何优雅地处理多个实现类并存的问题。通过接口定义,创建两个不同的实现一和实现二,并介绍了一个Service类来根据条件选择合适的实现。在Api测试中,展示了通过不同的URL路径可以分别调用到不同的实现,返回对应的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常规做法

@ConditionalOnProperty(name = "service.choice", havingValue = "service1")

我们都知道注解@ConditionalOnProperty可以进行配置选择注入,那如果多个实现想要并存如何实现呢,往下看:

多实现并存

接口

public interface MyService {
    String get();
}

实现一

@Service
public class MyServiceImpl1 implements MyService {
    @Override
    public String get() {
        return "Impl_1";
    }
}

实现二

@Service
public class MyServiceImpl2 implements MyService {
    @Override
    public String get() {
        return "Impl_2";
    }
}

Service选择

这个类主要是为了对多个实现类进行合理的选择(注意:这里存在bean依赖问题。通常来说解决bean依赖问题有两种方式:1.构造器依赖,2.DependsOn注解)

@Service
//@DependsOn({"myServiceImpl1", "myServiceImpl1"})
public class ServiceSwitch {
    private final Map<String, MyService> services = new HashMap<>();

    public ServiceSwitch(Map<String, MyService> map) {
        map.forEach((k, v) -> services.put(k, v));
    }

    /**
     * 根据名字返回相应的实现类
     *
     * @param type 类名
     * @return 实现类
     */
    public MyService get(String type) {
        return services.get(type);
    }
}

Api测试

public class ConfigApi {
    @Autowired
    private ServiceSwitch switch;

    @GetMapping("/service/{s}")
    public String getService(@PathVariable("s") String s) {
        final MyService myService = switch.get(s);
        return myService.get();
    }
}

测试

访问:http://localhost:8080/config/service/myServiceImpl1,返回:Impl_1

访问:http://localhost:8080/config/service/myServiceImpl2,返回:Impl_2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值