我必须实现一个实例工厂,它返回一个新的消息处理程序实例,具体取决于消息代码。
有一个接口 MessageHandler 和这个接口的大约 50 个实现。由于项目结构(maven 循环依赖...),工厂类与具体接口实现没有依赖关系。
一个messageHandler接口:
interface MessageHandler {
void receive(Message message);
MessageCode getMessageCode();
}
每个 MessageHandler 实现都返回一个唯一的消息代码。例如:
class FirstMessageHandler implements MessageHandler {
...
@Override
MessageCode getMessageCode(){
return MessageCodes.MESSAGE_TYPE_ONE;
}
...
}
class SecondMessageHandler implements MessageHandler {
...
@Override
MessageCode getMessageCode(){
return MessageCodes.MESSAGE_TYPE_TWO;
}
...
}
MessageHandlerFactory 应该为每条消息创建新的处理程序实例。工厂没有关于具体实现的信息,并且不依赖于实现的 maven 包。它只有消息代码。
class MessagehandlerFactory {
MessageHandler createHandler(MessageCode messageCode){
...
}
}
搜索后,我找到了一个关于 @Produce 注释的例子和这个很好的例子:
http://docs.oracle.com/javaee/6/tutorial/doc/gkgkv.html
但是在这个例子中,我需要知道工厂中的所有实现类型,这是不允许的。
实际上解决方案是使用@Any @Instance。
@Inject
@Any
private Instance<MessageHandler> messageHandlers;
@PostConstruct
public void init() {
for (MessageHandler handler : messageHandlers) {
messageHandlerMap.put(handler.getMessageCodes(), handler);
}
}
但是此代码为每个接收到的消息的所有 MessageHandler 实现的每个消息实例创建。可以结合@Produce 和@Qualifier 以便根据收到的MessageCode 只创建一个MessageHandler 实例?
我正在使用 Glassfish 3.1.2.2。