使用Spring MVC更好地练习:具有非固定依赖性的服务

时间:2014-11-25 18:58:55

标签: java spring spring-mvc dependency-injection

我要求与Spring 3.2中的新架构兼容。要求是:http请求将来到控制器,该控制器具有定义所需对象类型的属性。例如... mycontroller / load?objType ='obj1'。

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

@Controller
public class myController{

private ObjectService objectService;

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

}

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

if(objType.equals("obj1")) this.setObjectService(context.getBean("obj1Service"..))
if(objType.equals("obj2")) this.setObjectService(context.getBean("obj2Service"..))

我知道这不是一个很棒的设计,但我们需要将这些新模块与产生这种http请求的其他系统集成在一起。 这是必要的继承,因为我们在许多服务的代码中有非常相似的行为,但是在内部方法中进行了修改,因此部分行为将放在ObjectService中(它不是抽象的),代码的其他部分将放在其中儿童。还有另一种方法,更合适的做法吗?或者您认为这是一个可接受的解决方案?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

假设您有两项服务:

@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;
}

Spring将为地图注入其名称所映射的所有ObjectService bean。

load?objType=obj1处理程序中,你会有类似的东西:

objectServices.get("obj1").doSomething(); // will use ObjectServiceImpl1 

load?objType=obj2处理程序相同:

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

等等。