【发布时间】:2013-09-10 08:53:35
【问题描述】:
我 99% 的依赖是通过 @Autowired Spring 注解使用 DI 模式管理的。
尽管如此,在特定场景中,直到运行时我才能确定要使用哪个实现。
最广为人知的情况,是解析器的多重实现。
第一种解决方案是使用多个@Autowired(丑陋模式)
Interface Parser {
<T> T parse();
}
@Component("JsonParser")
class JsonParser implements Parser {
...
}
@Component("XmlParser")
class XmlParser implements Parser {
...
}
class MyService {
@Autowired
@Qualifier("XmlParser")
Parser xmlParser;
@Autowired
@Qualifier("JsonParser")
Parser jsonParser;
...
}
但是如果我有大量的实现是不能接受的。
第二种解决方案是使用 Spring 中的 ServiceLocator
interface ParserServiceLocatorFactory {
public Parser getParser(String parserName);
}
interface Parser {
<T> T parse();
}
@Component("JsonParser")
class JsonParser implements Parser {
...
}
@Component("XmlParser")
class XmlParser implements Parser {
...
}
class MyService {
@Autowired
ServiceFactory parserServiceLocatorFactory;
void exampleMethod() {
Parser xmlParser = parserServiceLocatorFactory.getParser("XmlParser");
}
}
这种方式对我来说似乎是正确的,但与第三种解决方案相比?
第三种方案是使用纯工厂模式并注入。
@Component
public ParserFactory {
Parser getParser(String parserName) {
...
}
}
interface Parser {
<T> T parse();
}
@Component("JsonParser")
class JsonParser implements Parser {
...
}
@Component("XmlParser")
class XmlParser implements Parser {
...
}
class MyService {
@Autowired
ParserFactory parserFactory
void exampleMethod() {
Parser xmlParser = parserFactory.getParser("XmlParser");
}
}
如果您对以前的解决方案有赞成/反对意见,或者对我的问题有更好的解决方案?
PS:这是伪代码,我可能会遗漏一些小东西:)
【问题讨论】:
-
所提供的答案都没有回答原始问题:服务定位器的附加值是什么
标签: java spring dependency-injection service-locator