Spring - 从同一个抽象类

时间:2017-07-17 09:53:19

标签: java spring

我正在努力找到解决问题的最佳方法。

我需要根据变量值在几个列表中选择一个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";

}

}

它的工作原理......但是我有几个服务类扩展了抽象的服务类,它看起来不像是一个做得好的工作流程,有没有办法让它更轻松?

2 个答案:

答案 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

}