我要求与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中(它不是抽象的),代码的其他部分将放在其中儿童。还有另一种方法,更合适的做法吗?或者您认为这是一个可接受的解决方案?
谢谢!
答案 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
等等。