Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringMVC的更好实践:具有非固定依赖性的服务_Java_Spring_Spring Mvc_Dependency Injection - Fatal编程技术网

Java SpringMVC的更好实践:具有非固定依赖性的服务

Java SpringMVC的更好实践:具有非固定依赖性的服务,java,spring,spring-mvc,dependency-injection,Java,Spring,Spring Mvc,Dependency Injection,我需要与基于Spring3.2的新体系结构兼容。要求是:http请求将到达一个控制器,该控制器具有一个定义所需对象类型的属性。例如…mycontroller/load?objType='obj1' 我的控制器将具有以下结构: @Controller public class myController{ private ObjectService objectService; @Autowired public setObjectService(ObjectService objectServ

我需要与基于Spring3.2的新体系结构兼容。要求是:http请求将到达一个控制器,该控制器具有一个定义所需对象类型的属性。例如…mycontroller/load?objType='obj1'

我的控制器将具有以下结构:

@Controller
public class myController{

private ObjectService objectService;

@Autowired
public setObjectService(ObjectService objectService){
    this.objectService = objectService;
}

}
所以在那之后,我需要检查这个属性来决定我将使用哪个服务。例如,这种情况是Obj1Service(方法:“加载”)。所有这些服务都是从ObjectService扩展而来的,所以:在每个传入呼叫中将ObjectService依赖项交换为Obj1Service/Obj2Service是一个好主意?例如:

if(objType.equals("obj1")) this.setObjectService(context.getBean("obj1Service"..))
if(objType.equals("obj2")) this.setObjectService(context.getBean("obj2Service"..))
我知道这不是一个很好的设计,但我们需要将这个新模块与产生这种http请求的其他系统集成。 继承是必要的,因为我们在许多服务的代码中有非常相似的行为,但在内部方法中有修改,所以部分行为将放在ObjectService中(它不是抽象的),而代码的其他部分将放在它的子对象中。还有其他更合适的方法吗?或者你认为这是一个可以接受的解决方案吗?
谢谢

您可以对所有服务使用
映射
,并在每个控制器方法中获得适当的服务

假设您有两项服务:

@Service("obj1")
public class ObjectServiceImpl1 implements ObjectService {
    ...
}

@Service("obj2")
public class ObjectServiceImpl2 implements ObjectService {
    ...
}
在控制器中:

private Map<String, ObjectService> objectServices;

@Autowired
public setObjectServices(Map<String, ObjectService> objectServices){
    this.objectServices= objectServices;
}
与加载?objType=obj2处理程序相同:

objectServices.get("obj2").doSomething(); // will use ObjectServiceImpl2 

等等。

您应该有一张服务类型的地图。谢谢!这就是我一直在寻找的!!
objectServices.get("obj2").doSomething(); // will use ObjectServiceImpl2