【发布时间】:2016-03-31 16:08:18
【问题描述】:
对于我的应用程序,我有一个Scale 接口和多个实现该接口的类,例如NormalizedScale、LogScale 等。在我的一个服务中,我需要创建许多Scales,我想使用 Spring 来定义它应该创建的 Scale 的实现。我将如何实现这样的东西?
--
我正在考虑创建一个工厂 ScaleFactory,就像在抽象工厂模式中一样,我可以调用 ScaleFactory.getScale() 来获得我在 Spring XML 中配置的任何实现的规模:
class ScaleFactory {
Class<? extends Scale> scaleImplClass;
public static Scale getScale() {
return scaleImplClass.newInstance();
}
}
Scale myScale = ScaleFactory.getScale();
但是使用这种方法,我如何配置 ScaleFactory 应该从 Spring XML 中使用哪个实现?
--
另一种方法是将ScaleFactory 设为@Service,然后将ScaleFactory 自动连接到我的服务中:
@Autowired
ScaleFactory scaleFactory;
...
Scale myScale = scaleFactory.getScale();
然后我可以使用 ScaleFactory 中的自动装配属性来定义 scaleImplClass。但这似乎很奇怪,因为我的工厂也是一个服务,我有那个工厂的一个实例。
--
另一种方法是在我的 service 中使用 Class scaleImplementationClass 属性而不是 ScaleFacotry 并像这样使用 ScaleFactory:
@Value("${scaleImplementationClass}")
Class scaleImplementationClass
...
Scale myScale = ScaleFactory.getScale(scaleImplementationClass);
但是工厂是毫无意义的,因为我也可以运行scaleImplementationClass.newInstance()。
【问题讨论】:
-
您希望通过这种方法获得什么?抽象工厂实际上正在取代 Spring 想要为您做的一些事情,并远离依赖注入,这是您感到阻力的地方。相反,您可以做的只是将
@Autowire private Scale scale添加到需要Scale实例的任何类中。 Spring 将自动找到您在 XML 中定义的任何实现并将其加载到相应位置。你不需要工厂类。 -
Colin,如果我
@Autowire Scale scale,我只会得到 一个 比例,但我需要创建 许多 比例。这就是为什么我认为我需要一个工厂。我猜另一种选择是创建多个工厂(每个实现 Scale 一个),然后 @Autowire 正确的工厂。 -
这是有道理的。请参阅下面的答案,如果它对您有帮助,请告诉我。 (编辑:删除了我的答案,意识到它没有直接回答你的问题。清除它)。
-
添加了我更新的答案