转:http://www.javaeye.com/topic/519498
基于SPRING的事件处理其实很简单,初学者不必一开始就担心搞不懂,本文先是介绍完全基于SPRING的事件监听实现(熟识Spring事件监听的朋友应该跳过第一节),然后依葫芦画瓢自已做一个性能更好事件监听小框架,最后在回贴中加入了注解版。
为何要使用事件监听,而不是直接调用?打个比方,在系统删除一个用户时,需要把用户的其他信息和行为记录一起删除,此时最容易想到的是:删除用户时,调用其他Service类接口删除与之相关的信息和用户行为记录,但是用户是一个基础模块,随着系统模块不断增加,会有越来越多的模块与之关联,按以上方案,每增加一个与用户相关的模块,那么删除用户时就要把这个模块的信息也一起删除,这样用户这个模块就与这些业务模块偶合在一起了,只要系统不断的增加或减少模块,用户模块就永远都改不完。(以上逻辑仅为说明问题)
如果采用事件监听,那么在删除一个用户时,发布一事件就完事了,所有相关的模块监听此事件,在事件处理中删除本模块对应的数据,那么用户模块也不会与这些模块有任何偶合了。
好,回到主题,
1、完全基于SPRING的事件监听与处理:
首先,SERVICE总接口类继承org.springframework.context.ApplicationListener接口,并且在SERVICE的抽象类中实现此接口的方法,SERVICE总接口代码:
- import org.springframework.context.ApplicationListener;
- /**
- * 业务层顶层接口
- */
- public interface IBaseService extends ApplicationListener{
- }
import org.springframework.context.ApplicationListener;
/**
* 业务层顶层接口
*/
public interface IBaseService extends ApplicationListener{
}
SERVICE抽象类代码,所有具体业务类皆继承此抽象业务类
- import org.springframework.context.ApplicationEvent;
- /**
- * 实现顶层接口的抽象类
- */
- public abstract class AbstractBaseService implements IBaseService {
- /**
- * 此方法不允许重写,要监听事件,重写onBaseEvent方法
- */
- public final void onApplicationEvent(ApplicationEvent event) {
- if (event instanceof BaseEvent) {
- onBaseEvent((BaseEvent) event);
- }
- }
- /**
- * 要监听事件就重写此方法
- */
- protected void onBaseEvent(BaseEvent event) {
- }
- /**
- * 发布事件
- */
- protected final void publishEvent(BaseEvent event) {
- //取得SPRING容器并发布事件
- org.springframework.web.context.ContextLoader.getCurrentWebApplicationContext().publishEvent(event);
- }
- }
import org.springframework.context.ApplicationEvent;
/**
* 实现顶层接口的抽象类
*/
public abstract class AbstractBaseService implements IBaseService {
/**
* 此方法不允许重写,要监听事件,重写onBaseEvent方法
*/
public final void onApplicationEvent(ApplicationEvent event) {
if (event instanceof BaseEvent) {
onBaseEvent((BaseEvent) event);
}
}
/**
* 要监听事件就重写此方法
*/
protected void onBaseEvent(BaseEvent event) {
}
/**
* 发布事件
*/
protected final void publishEvent(BaseEvent event) {
//取得SPRING容器并发布事件
org.springframework.web.context.ContextLoader.getCurrentWebApplicationContext().publishEvent(event);
}
}
BaseEvent类是我自定义的一个类,各业务模块要发布事件,首先定义自已的EVENT类,继承BaseEvent。BaseEvent类代码
- import org.springframework.context.ApplicationEvent;
- public class BaseEvent extends ApplicationEvent {
- public BaseEvent(Object source) {
- super(source);
- }
- }
import org.springframework.context.ApplicationEvent;
public class BaseEvent extends ApplicationEvent {
public BaseEvent(Object source) {
super(source);
}
}
用户业务类UserSerivceImpl删除一个用户时,需要发布事件,所以要先定义一个UserDeleteEvent事件类
- import com.esc.permission.model.User;
- public class UserDeleteEvent extends BaseEvent {
- public UserDeleteEvent(User user){
- super(user);
- }
- public User getUser(){
- return (User) super.getSource();
- }
- }
import com.esc.permission.model.User;
public class UserDeleteEvent extends BaseEvent {
public UserDeleteEvent(User user){
super(user);
}
public User getUser(){
return (User) super.getSource();
}
}
下面是UserSerivceImpl类删除用户的方法模拟
- public void deleteUser(String id){
- //先发布删除事件
- publishEvent(new UserDeleteEvent(new User(id)));
- //再把用户删除
- userDao.deleteUser(id);
- }
public void deleteUser(String id){
//先发布删除事件
publishEvent(new UserDeleteEvent(new User(id)));
//再把用户删除
userDao.deleteUser(id);
}
假如有一个OtherServiceImpl业务类需要接收用户删除事件并做一些处理,
- public class OtherServiceImpl extends AbstractBaseService {
- private IBaseDAO otherDao;
- /**
- * 重写父类的方法,处理用户删除事件
- */
- protected void onBaseEvent(BaseEvent baseEvent){
- if(baseEvent instanceof UserDeleteEvent){//如果是用户删除事件
- otherDao.deleteOtherData(((User)baseEvent.getSource()).getId());
- }
- }
- }
public class OtherServiceImpl extends AbstractBaseService {
private IBaseDAO otherDao;
/**
* 重写父类的方法,处理用户删除事件
*/
protected void onBaseEvent(BaseEvent baseEvent){
if(baseEvent instanceof UserDeleteEvent){//如果是用户删除事件
otherDao.deleteOtherData(((User)baseEvent.getSource()).getId());
}
}
}
到此,所有逻辑就完了,用户业务类中根本不需要知道谁将会处理此事件,所以完全与其它模块解偶了。
这里用了一个偷懒的方法,那就是在业务类的顶层接口IBaseService中实现了ApplicationListener接口,这样其实所有具体业务类都参与了所有事件的处理,即使是那些根本不需要监听事件的业务类。对于所有根本不需要监听事件的业务类,事件发生时就调用其父类空方法onBaseEvent,这里有一点性能浪费,如果改进?不要在顶层接口IBaseService中实现ApplicationListener接口,而是在具体的需要监听事件的业务类中实现此接口,但是这样还是有一点缺陷,那就是此具体业务类还是会监听到它不关心的事件,不论是用户删除事件还是用户修改事件,没办法,有得必有失,想要方便,肯定会有所牺牲。
如果只想监听到自已所关心的事件呢,那么就要自已实现一套事件处理的小框架了:
2、自定义的事件监听与处理框架。
首先重新定义事件监听器接口,不再使用SPRING提供的ApplicationListener接口:
- import java.util.List;
- /**
- * 事件处理接口,实现此接口并且getEventClasses方法的返回结果条数大于0,方可处理对应的事件
- */
- public interface IBaseEventListener {
- /**
- * 事件处理的方法
- */
- public void onBaseEvent(BaseEvent event);
- /**
- * 所要处理的事件类型
- */
- public List<Class<? extends BaseEvent>> getEventClasses();
- }
import java.util.List;
/**
* 事件处理接口,实现此接口并且getEventClasses方法的返回结果条数大于0,方可处理对应的事件
*/
public interface IBaseEventListener {
/**
* 事件处理的方法
*/
public void onBaseEvent(BaseEvent event);
/**
* 所要处理的事件类型
*/
public List<Class<? extends BaseEvent>> getEventClasses();
}
这个接口比SPRING的事件接口多了一个方法。因为SPRING原来做法是只要实现了它提供的接口,任何事件发生时都会得到调用,这种做法是很方便使用的,这里沿用了这种思路。多出的那个方法作用是描述本类处理哪些事件。这时我需要一个类,这个类要在系统启动时把所有实现此接口的业务类找出来,归好类,以便事件发生时进行精确调用,并且提供事件发布事件的静态方法,这样我们才能知道事件在何时发生了。好,下面就来编写这个类
- /**
- * 事件处理相关操作工具类
- */
- public class EventController {
- /** KEY:事件类的类名,值:所有监听此事件的处理类实例 */
- private static Map<String,List<IBaseEventListener>> listeners = new LinkedHashMap<String, List<IBaseEventListener>>();
- private EventController(){
- //no instance
- }
- /**
- * 扫瞄所有bean,进行事件监听(业务类按事件类型归类),此方法要在系统启动完后立即调用
- * 此方法大概过程是
- * 1、从SPRING中找出所实现了IBaseEventListener的具体业务类实例
- * 2、把这些实例归类装进MAP变量listeners中,此MAP变量的结构是:
- * "UserDeleteEvent.class",{ortherServiceImpl,xxxServiceImpl,...}
- * "UserUpdateEvent.class",{yyyServiceImpl,zzzServiceImpl,...}
- * key,valueList
- */
- public static void initBaseEventListener(){
- //从SPRING中得到实现了某接口的业务类
- Map<String,IBaseEventListener> beans = ContextLoader.getCurrentWebApplicationContext().getBeansOfType(IBaseEventListener.class);
- if(beans==null || beans.size()==0)
- return;
- //下面循环进行归类
- Collection<IBaseEventListener> services = beans.values();
- for (IBaseEventListener service : services) {
- List<Class<? extends BaseEvent>> eventClasses = service.getEventClasses();
- if(eventClasses==null || eventClasses.size()==0)
- continue;
- for (int i = 0; i < eventClasses.size(); i++) {
- List<IBaseEventListener> list = listeners.get(eventClasses.get(i).getName());
- if(list==null){
- list = new ArrayList<IBaseEventListener>();
- listeners.put(eventClasses.get(i).getName(), list);
- list.add(service);
- }else{
- if(list.contains(service)){
- continue;
- }else{
- list.add(service);
- }
- }
- }
- }
- }
- /**
- * 发布事件的静态方法
- */
- public static void publishEvent(BaseEvent event){
- //根据实际事件名称,从listeners中找出监听了此事件的业务类,调用之
- List<IBaseEventListener> list = listeners.get(event.getClass().getName());
- if(list!=null && list.size()>0){
- for (IBaseEventListener listener : list) {
- //此处不能捕捉异常,因为任何一个处理类实例出错都应该全部回滚
- listener.onBaseEvent(event);
- }
- }
- }
- }
/**
* 事件处理相关操作工具类
*/
public class EventController {
/** KEY:事件类的类名,值:所有监听此事件的处理类实例 */
private static Map<String,List<IBaseEventListener>> listeners = new LinkedHashMap<String, List<IBaseEventListener>>();
private EventController(){
//no instance
}
/**
* 扫瞄所有bean,进行事件监听(业务类按事件类型归类),此方法要在系统启动完后立即调用
* 此方法大概过程是
* 1、从SPRING中找出所实现了IBaseEventListener的具体业务类实例
* 2、把这些实例归类装进MAP变量listeners中,此MAP变量的结构是:
* "UserDeleteEvent.class",{ortherServiceImpl,xxxServiceImpl,...}
* "UserUpdateEvent.class",{yyyServiceImpl,zzzServiceImpl,...}
* key,valueList
*/
public static void initBaseEventListener(){
//从SPRING中得到实现了某接口的业务类
Map<String,IBaseEventListener> beans = ContextLoader.getCurrentWebApplicationContext().getBeansOfType(IBaseEventListener.class);
if(beans==null || beans.size()==0)
return;
//下面循环进行归类
Collection<IBaseEventListener> services = beans.values();
for (IBaseEventListener service : services) {
List<Class<? extends BaseEvent>> eventClasses = service.getEventClasses();
if(eventClasses==null || eventClasses.size()==0)
continue;
for (int i = 0; i < eventClasses.size(); i++) {
List<IBaseEventListener> list = listeners.get(eventClasses.get(i).getName());
if(list==null){
list = new ArrayList<IBaseEventListener>();
listeners.put(eventClasses.get(i).getName(), list);
list.add(service);
}else{
if(list.contains(service)){
continue;
}else{
list.add(service);
}
}
}
}
}
/**
* 发布事件的静态方法
*/
public static void publishEvent(BaseEvent event){
//根据实际事件名称,从listeners中找出监听了此事件的业务类,调用之
List<IBaseEventListener> list = listeners.get(event.getClass().getName());
if(list!=null && list.size()>0){
for (IBaseEventListener listener : list) {
//此处不能捕捉异常,因为任何一个处理类实例出错都应该全部回滚
listener.onBaseEvent(event);
}
}
}
}
接着重新定义事件类本身,此类也不再继承SPRING的ApplicationEvent类,其它基本还和原来一样。
- public class BaseEvent {
- private Object source;
- public BaseEvent() {
- }
- public BaseEvent(Object source) {
- this.source = source;
- }
- public Object getSource() {
- return source;
- }
- }
public class BaseEvent {
private Object source;
public BaseEvent() {
}
public BaseEvent(Object source) {
this.source = source;
}
public Object getSource() {
return source;
}
}
业务类顶层接改而继承自已的事件接口
- /**
- * 业务层顶层接口
- */
- public interface IBaseService extends IBaseEventListener{
- }
/**
* 业务层顶层接口
*/
public interface IBaseService extends IBaseEventListener{
}
在SERVICE的抽象类中去掉onApplicationEvent方法,不需要了,改写发布事件的方法,修改后变成这样
- import org.springframework.context.ApplicationEvent;
- /**
- * 实现顶层接口的抽象类
- */
- public abstract class AbstractBaseService implements IBaseService {
- /**
- * 发布事件
- */
- protected final void publishEvent(BaseEvent event) {
- //使用自已事件工具类发布事件
- EventController.publishEvent(event);
- }
- /**
- * 默认实现处理事件的方法
- */
- public void onBaseEvent(BaseEvent event) {
- }
- /**
- * 注意虽然也是在顶层接口中都实现了事件监听,但是只有这个方法有返回值时,才真正的会被调用
- */
- public List<Class<? extends BaseEvent>> getEventClasses(){
- return null;
- }
- }
import org.springframework.context.ApplicationEvent;
/**
* 实现顶层接口的抽象类
*/
public abstract class AbstractBaseService implements IBaseService {
/**
* 发布事件
*/
protected final void publishEvent(BaseEvent event) {
//使用自已事件工具类发布事件
EventController.publishEvent(event);
}
/**
* 默认实现处理事件的方法
*/
public void onBaseEvent(BaseEvent event) {
}
/**
* 注意虽然也是在顶层接口中都实现了事件监听,但是只有这个方法有返回值时,才真正的会被调用
*/
public List<Class<? extends BaseEvent>> getEventClasses(){
return null;
}
}
到此框架就完成了,UserServiceImpl删除用户时发布事件的代码还和原来一样,不需要改变,只是监听类要变一下,不再实现ApplicationListener接口,改而实现IBaseEventListener接口,不过不需要再具体类中实现,因为已经在顶层接口中继承了,代码
- public class OtherServiceImpl extends AbstractBaseService {
- private IBaseDAO otherDao;
- /**
- * 重写父类的方法,处理用户删除事件
- */
- protected void onBaseEvent(BaseEvent baseEvent){
- //如果本类只处理一个事件,这里就不需要再类型判断了
- UserDeleteEvent event = (UserDeleteEvent)baseEvent;
- otherDao.deleteOtherData(event.getSource().getId());
- }
- /**
- * 返回本类所要处理所有事件
- */
- public List<Class<? extends BaseEvent>> getEventClasses() {
- List<Class<? extends BaseEvent>> eventClasses = new ArrayList<Class<? extends BaseEvent>>(1);
- //本类只监听用户删除事件
- eventClasses.add(UserDeleteEvent.class);
- return eventClasses;
- }
- }
- 3、注解版实现:
1、定义注解类
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Target(ElementType.METHOD)
- @Retention(RetentionPolicy.RUNTIME)
- public @interface HandleEvent {
- Class<? extends BaseEvent>[] events();
- }
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface HandleEvent { Class<? extends BaseEvent>[] events(); }
2、在顶层接口IBaseService增加一个方法getRealClass,此方法用于返回真正的业务类字节码引用,此方法在抽象业务类用统一实现即可。本来不需要此方法,但由于使用了SPRING的AOP,一时没有找到取得真正业务类字节码引用的方法,所以才定义这么个接口,代码
- /**
- * 业务层顶层接口,自定义的小框架里可以在顶层业务接口中直接继承事件接口,不影响性能
- * 因为在初始化事件监听器时,已经过滤了没有真正实现接口方法的类,所以不会造成多余的调用
- */
- public interface IBaseService extends IBaseEventListener{
- public Class<? extends IBaseService> getRealClass();
- }
/** * 业务层顶层接口,自定义的小框架里可以在顶层业务接口中直接继承事件接口,不影响性能 * 因为在初始化事件监听器时,已经过滤了没有真正实现接口方法的类,所以不会造成多余的调用 */ public interface IBaseService extends IBaseEventListener{ public Class<? extends IBaseService> getRealClass(); }
抽象业务类的代码
- /**
- * 实现顶层接口的抽象类
- */
- public abstract class AbstractBaseService implements IBaseService{
- /**
- * 发布事件 2008-9-18
- */
- protected void publishEvent(BaseEvent event) {
- EventController.publishEvent2(event);
- }
- //具体子类中不需要再实现
- public Class<? extends IBaseService> getRealClass(){
- return this.getClass();
- }
- public void onBaseEvent(BaseEvent event){
- //这里空实现,且没有注解,这样,如果具体业务类没有重写方法,
- //初始化事件监听器时就会被过滤掉,不会造成多余调用
- }
- }
/** * 实现顶层接口的抽象类 */ public abstract class AbstractBaseService implements IBaseService{ /** * 发布事件 2008-9-18 */ protected void publishEvent(BaseEvent event) { EventController.publishEvent2(event); } //具体子类中不需要再实现 public Class<? extends IBaseService> getRealClass(){ return this.getClass(); } public void onBaseEvent(BaseEvent event){ //这里空实现,且没有注解,这样,如果具体业务类没有重写方法, //初始化事件监听器时就会被过滤掉,不会造成多余调用 } }
改写IBaseEventListener接口,删除getEventClasses方法,因为使用注解来定义要处理事件,所以此方法不再需要。本来onBaseEvent方法也可以去除,直接由注解来定义即可,但由于以下原因,还是要保留:1、如果没有任何接口定义onBaseEvent方法,那么SPRING的代理类也不会有此方法,这样就无法使用AOP的种种好处了;2、为规范事件处理的方法名和参数,更易于后续维护,所以还是要有个接口定义为好。
- /**
- * 事件处理接口,实现此接口并且getEventClasses方法的返回结果条数大于0,方可处理对应的事件
- */
- public interface IBaseEventListener {
- /**
- * 事件处理的方法
- */
- public void onBaseEvent(BaseEvent event);
- }
/** * 事件处理接口,实现此接口并且getEventClasses方法的返回结果条数大于0,方可处理对应的事件 */ public interface IBaseEventListener { /** * 事件处理的方法 */ public void onBaseEvent(BaseEvent event); }
事件处理工具类
- /**
- * 事件处理相关操作工具类
- */
- public class EventController {
- private static Map<String,List<LisenerInfo>> listeners2 = new LinkedHashMap<String, List<LisenerInfo>>();
- /**
- * 扫瞄所有bean,进行事件监听
- */
- public static void initBaseEventListener2(){
- //取得所有业务类
- Map<String,IBaseService> beans = SysContext.getBeansOfType(IBaseService.class);
- if(beans==null || beans.size()==0)
- return;
- Collection<IBaseService> values = beans.values();
- for (IBaseService listener : values) {
- //注意这里不能使用listener.getClass()方法,因此方法返回的只是SPRING的代理类,此代理类的方法没有注解信息
- Method[] methods = listener.getRealClass().getDeclaredMethods();
- for (Method method : methods) {
- //判断方法中是否有指定注解类型的注解
- boolean hasAnnotation = method.isAnnotationPresent(HandleEvent.class);
- if (hasAnnotation) {
- //根据注解类型返回方法的指定类型注解
- HandleEvent annotation = method.getAnnotation(HandleEvent.class);
- Class<? extends BaseEvent>[] events = annotation.events();
- if(events==null || events.length==0){//这里过滤掉没有真正实现事件监听的业务类
- continue;
- }
- for (int i = 0; i < events.length; i++) {
- try {
- if(listeners2.containsKey(events[i].getName())){
- //注意这里要用代理类的方法,即listener.getClass().getMethod(method.getName()),不能直接使用method变量,下同
- listeners2.get(events[i].getName()).add(new LisenerInfo(listener,listener.getClass().getMethod(method.getName())));
- }else{
- listeners2.put(events[i].getName(),Arrays.asList(new LisenerInfo[]{new LisenerInfo(listener,listener.getClass().getMethod(method.getName()))}));
- }
- } catch (Exception e) {
- throw new UnknowException("初始化事件监听器时出错:",e);
- }
- }
- }
- }
- }
- }
- /**
- * 发布事件
- */
- public static void publishEvent2(BaseEvent event){
- List<LisenerInfo> list = listeners2.get(event.getClass().getName());
- if(list!=null && list.size()>0){
- for (LisenerInfo listener : list) {
- try {
- listener.getMethod().invoke(listener.getService(), event);
- } catch (Exception e) {
- //此处不能捕捉异常,因为任何一个处理类实例出错都应该全部回滚
- throw new UnknowException(e);
- }
- }
- }
- }
- }
- //此类记录目标方法和目标类
- class LisenerInfo{
- private Method method;//目标方法
- private Object service;//业务类实例
- public LisenerInfo(Object service,Method method){
- this.method = method;
- this.service = service;
- }
- public Method getMethod() {
- return method;
- }
- public Object getService() {
- return service;
- }
- }
/** * 事件处理相关操作工具类 */ public class EventController { private static Map<String,List<LisenerInfo>> listeners2 = new LinkedHashMap<String, List<LisenerInfo>>(); /** * 扫瞄所有bean,进行事件监听 */ public static void initBaseEventListener2(){ //取得所有业务类 Map<String,IBaseService> beans = SysContext.getBeansOfType(IBaseService.class); if(beans==null || beans.size()==0) return; Collection<IBaseService> values = beans.values(); for (IBaseService listener : values) { //注意这里不能使用listener.getClass()方法,因此方法返回的只是SPRING的代理类,此代理类的方法没有注解信息 Method[] methods = listener.getRealClass().getDeclaredMethods(); for (Method method : methods) { //判断方法中是否有指定注解类型的注解 boolean hasAnnotation = method.isAnnotationPresent(HandleEvent.class); if (hasAnnotation) { //根据注解类型返回方法的指定类型注解 HandleEvent annotation = method.getAnnotation(HandleEvent.class); Class<? extends BaseEvent>[] events = annotation.events(); if(events==null || events.length==0){//这里过滤掉没有真正实现事件监听的业务类 continue; } for (int i = 0; i < events.length; i++) { try { if(listeners2.containsKey(events[i].getName())){ //注意这里要用代理类的方法,即listener.getClass().getMethod(method.getName()),不能直接使用method变量,下同 listeners2.get(events[i].getName()).add(new LisenerInfo(listener,listener.getClass().getMethod(method.getName()))); }else{ listeners2.put(events[i].getName(),Arrays.asList(new LisenerInfo[]{new LisenerInfo(listener,listener.getClass().getMethod(method.getName()))})); } } catch (Exception e) { throw new UnknowException("初始化事件监听器时出错:",e); } } } } } } /** * 发布事件 */ public static void publishEvent2(BaseEvent event){ List<LisenerInfo> list = listeners2.get(event.getClass().getName()); if(list!=null && list.size()>0){ for (LisenerInfo listener : list) { try { listener.getMethod().invoke(listener.getService(), event); } catch (Exception e) { //此处不能捕捉异常,因为任何一个处理类实例出错都应该全部回滚 throw new UnknowException(e); } } } } } //此类记录目标方法和目标类 class LisenerInfo{ private Method method;//目标方法 private Object service;//业务类实例 public LisenerInfo(Object service,Method method){ this.method = method; this.service = service; } public Method getMethod() { return method; } public Object getService() { return service; } }
好了,框架完成,事件发布还和以前那样,来看看事件处理的实现,同样也不再需要getEventClasses方法了
- //不再需要每个具体业务都实现IBaseEventListener接口
- public class OtherServiceImpl extends AbstractBaseService implements OtherService{
- private IBaseDAO otherDao;
- /**
- * 重写父类的方法,处理用户删除事件
- */
- @HandleEvent(events={UserDeleteEvent.class,UserUpdateEvent.class})
- public void onBaseEvent(BaseEvent baseEvent){
- if(baseEvent instanceof UserDeleteEvent){//如果是用户删除事件
- otherDao.deleteOtherData(((User)baseEvent.getSource()).getId());
- }else{
- //....
- }
- }
- }
//不再需要每个具体业务都实现IBaseEventListener接口 public class OtherServiceImpl extends AbstractBaseService implements OtherService{ private IBaseDAO otherDao; /** * 重写父类的方法,处理用户删除事件 */ @HandleEvent(events={UserDeleteEvent.class,UserUpdateEvent.class}) public void onBaseEvent(BaseEvent baseEvent){ if(baseEvent instanceof UserDeleteEvent){//如果是用户删除事件 otherDao.deleteOtherData(((User)baseEvent.getSource()).getId()); }else{ //.... } } }