【问题标题】:Better practice with Spring MVC: Service with non-fixed dependencySpring MVC 的更好实践:具有非固定依赖项的服务
【发布时间】:2014-11-25 18:58:54
【问题描述】:

我需要与基于 Spring 3.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 中(它不是抽象的),而其他部分代码将放在里面孩子们。还有其他更合适的方法来做到这一点吗?或者您认为这是一个可以接受的解决方案?

谢谢!

【问题讨论】:

  • 你应该有一个类型到服务的映射。

标签: java spring spring-mvc dependency-injection


【解决方案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 

等等。

【讨论】:

  • 谢谢!这就是我要找的东西!!
猜你喜欢
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 2020-08-07
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 2012-01-14
相关资源
最近更新 更多