在项目需要正对一个事件做分发,触发多个处理逻辑Handler,普通的使用Java代码做会造成代码的高耦合,如果后期涉及到处理添加、修改、去除Handler都会涉及到整体代码变更增加测试复杂度。
本文将列举一种通过Guava 的EventBus实现事件和Handler的注册机制,并结合Spring使得整个Handler挂载卸载配置化。
包装原生的Guava Handler ,继承EventBus InitializingBean 并在继承方式afterPropertiesSet中注册Handler到EventBus中
com.qyou.EventBusAdapter
/**
* EventBus适配器
* Created by xueping.you on 15-5-5.
*/
public class EventBusAdapter extends EventBus implements InitializingBean {
private List<EventAbstract> eventBusListener;
public void setEventBusListener(List<EventAbstract> eventBusListener) {
this.eventBusListener = eventBusListener;
}
@Override
public void afterPropertiesSet() throws Exception {
for(EventAbstract eventAbstract : eventBusListener){
this.register(eventAbstract);
}
}
}
定义Handler的抽象接口类
/**
* Event 事件处理抽象接口类
* Created by xueping.you on 15-5-5.
*/
public interface EventAbstract<E> {
/** event Handler处理接口 **/
void handle(E event);
}
定义处理事件Entity
public class TestEvent001{
//...code
}
public class TestEvent002{
//...code
}
实现Handler 类
Handler1:com.qyou.SendFailMailHandler
public class SendFailMailHandler implements EventAbstract<TestEvent001> {
@Subscribe //EventBus 标签
@Override
public void handle(TestEvent001 event) {
//...处理代码
}
}
Handler2:com.qyou.SendSuccessSMSHandler
public class SendSuccessSMSHandler implements EventAbstract<TestEvent002> {
@Subscribe //EventBus 标签
@Override
public void handle(TestEvent002 event) {
//...处理代码
}
}
最后使用Spring配置文件,将Handler注册到EventBus中
<!-- EventBusListener 定义 -->
<util:list id="eventBusListener" value-type="com.qyou.EventAbstract">
<bean class="com.qyou.SendFailMailHandler "/>
<bean class="com.qyou.SendSuccessSMSHandler "/>
</util:list>
<!-- EventBusAdapter适配器 -->
<bean id="eventBusAdapter" class="com.qyou..EventBusAdapter">
<property name="eventBusListener" ref="eventBusListener"/>
</bean>
最终Demo使用
TestEvent001 event = ....
eventBusAdapter.post(event);