我正在努力找到解决问题的最佳方法。
我需要根据变量值在几个列表中选择一个Service接口(及其具体实现)。
具体实现扩展了一个抽象类。
所以我有
public abstract class AbstractService {
public void method1(){
//do stuff
}
public void method2(){
//do stuff
}
}
然后我们
public interface Service1{
void method1();
void method2();
void method3();
void method4();
}
public interface Service2 implements Service{
void method1();
void method2();
void method3();
void method4();
}
public interface ServiceN implements Service{
void method1();
void method2();
void method3();
void method4();
}
最后,实现
@Service
public class Service1Implementation extends AbstractService implements Service1 {
}
@Service
public class Service2Implementation extends AbstractService implements Service2 {
}
@Service
public class ServiceNImplementation extends AbstractService implements ServiceN {
}
现在,例如,我需要在控制器中根据变量值来决定我需要哪种服务。
我的想法是自动装配控制器中的所有服务接口,然后执行类似这样的操作
@Controller
public class Controller{
@Autowired Service1 service1;
@Autowired Service2 service2;
//...
@Autowired ServiceN serviceN
@GetMapping("/")
public String myController(){
int variable;
switch(variable){
case 1:
service1.method()1;
break;
case 2:
service2.method1();
//....
break;
case n:
serviceN.method1();
break();
return "template";
}
}
它的工作原理......但是我有几个服务类扩展了抽象的服务类,它看起来不像是一个做得好的工作流程,有没有办法让它更轻松?
答案 0 :(得分:0)
为此目的使用@Qualifier
。请参阅this
答案 1 :(得分:0)
您可以使用switch
查找替换Map
语句,您将在int
中使用switch
作为关键字,public String myController(){
int variable = ;
switch(variable){
case 1:
service1.method();
break;
case 2:
service2.method1();
//....
break;
case n:
serviceN.method1();
break();
}
...
}
作为与地图相关联的服务实例的值。
这是合乎逻辑的:
public String myController(){
int variable = ...;
Service service = servicesByCode.get(variable);
service.method1();
...
}
可以替换为:
Map
正如所解释的那样,你应该在类中添加一个private Map<Integer, Service> servicesByCode;
@PostConstruct
private void postConstruct() {
servicesByCode = new HashMap<>();
servicesByCode.put(1, service1);
servicesByCode.put(2, service2);
servicesByCode.put(3, service3);
...
}
字段,并在bean自动装配后在地图中添加一个方法:
internal object ExecuteJob(RequestParam inputParam)
{
bool jobStatus = false;
var result = jobManager.ExecuteJob(inputParam);
// Code continues
}