【发布时间】:2017-08-25 00:02:46
【问题描述】:
我有一个这样的接口/实现:
public interface Processor {
void processMessage(Message m);
}
@Component
public class FooAProcessor implements Processor {
private FooA fooA;
public FooAProcessor(FooA fooA) {
this.fooA = fooA;
}
@Override
public void processMessage(Message m) {
//do stuff
}
}
@Component
public class FooBProcessor implements Processor {
private FooA fooA;
public FooBProcessor(FooA fooA) {
this.fooA = fooA;
}
@Override
public void processMessage(Message m) {
//do stuff
}
}
FooA bean 很简单,如下所示:
@Component
public class FooA {
//stuff
}
还有消息类:
public class Message {
private Class clazz;
}
我正在从队列中提取消息。我需要提供一个具体的处理器来适当地处理不同类型的消息。这是消息接收者:
public class MessageReceiver {
public void handleMessage(Message m) {
Processor processor = //get concrete implementation from Message clazz
processor.processMessage(m);
}
}
我如何准确地使用类名/对象来定义Processor 的具体实现?
我的第一个想法是开发某种工厂,它接收一个类并提供具体实现。像这样的:
@Component
public class ProcessorFactory {
private FooAProcessor fooAProcessor;
private FooBProcessor fooBProcessor;
public ProcessorFactory(FooAProcessor fooAProcessor, FooBProcessor fooBProcessor) {
this.fooAProcessor = fooAProcessor;
this.fooBProcessor = fooBProcessor;
}
public Processor getFactory(Class clazz) {
if(clazz.isAssignableFrom(FooAProcessor.class)) {
return fooAProcessor;
}
}
}
或者像这样使用应用程序上下文:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.getBean(clazz);
这是解决此问题的最佳方法吗?有更好的做法吗?
【问题讨论】:
-
你可以按类从应用上下文中获取bean。但我怀疑这是否是一个合理的设计。我宁愿在
Message中引入某种消息类型标识符,并设置MessageReceiver使用的messageType-vs-Processor查找映射 -
@Richard 你快到了 应用程序上下文本身是一个工厂接口,用于根据类型或名称获取适当的 bean。所以不要再定义一个工厂,而是写一个utiltiy类来根据类型或名称获取bean。
标签: java spring javabeans factory factory-pattern