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

被折叠的 条评论
为什么被折叠?



