Я знаю, что это старый вопрос, но я думаю, что более современное решение заключается в использовании Guava's Event Bus (предоставлен Я не уверен, если он будет работать на GWT, но и ваш заголовок и теги не говорят GWT).
У меня есть обычай RabbitMQ simple message container, который автоматически создаст привязки очередей и полученные сообщения отправит в Guava EventBus. Его невероятная элегантность и весы великолепно.
Вы можете легко использовать свою инфраструктуру DI для регистрации подписчиков. Для Spring я создаю BeanPostProcessor, который автоматически регистрирует bean-компоненты с @Subscribe
.
Ниже Spring BeanPostProcessor:
package com.snaphop.spring;
import java.lang.reflect.Method;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
@Component
public class EventBusBeanPostProcessor implements BeanPostProcessor {
private EventBus eventBus;
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (isApplicable(bean)) {
eventBus.register(bean);
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
protected boolean isApplicable(Object bean) {
for(Method m : bean.getClass().getMethods()) {
if (m.isAnnotationPresent(Subscribe.class))
return true;
}
return false;
}
@Autowired
public void setEventBus(EventBus eventBus) {
this.eventBus = eventBus;
}
}
Я уверен, что это тривиально, чтобы сделать что-то подобное в Guice.
Вы можете посмотреть здесь https://github.com/javaplugs/minibus, это чрезвычайно легкий и простой автобус событий. – rumatoest