- 浏览: 118971 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
IAmMrLi:
...
基于HIBERNATE的全自动查询框架(二) -
ganbo:
...
基于HIBERNATE的全自动查询框架(二) -
ganbo:
...
基于HIBERNATE的全自动查询框架(二) -
wanbing1986:
给我一份借鉴下wanbing1986@126.com,谢谢
基于HIBERNATE的全自动查询框架(一) -
Cynthia9023:
博主我也没有权限下载 能否也发我一份?jane9023@163 ...
基于HIBERNATE的全自动查询框架(一)
基于SPRING的事件处理其实很简单,初学者不必一开始就担心搞不懂,本文先是介绍完全基于SPRING的事件监听实现(熟识Spring事件监听的朋友应该跳过第一节),然后依葫芦画瓢自已做一个性能更好事件监听小框架,最后在回贴中加入了注解版。
为何要使用事件监听,而不是直接调用?打个比方,在系统删除一个用户时,需要把用户的其他信息和行为记录一起删除,此时最容易想到的是:删除用户时,调用其他Service类接口删除与之相关的信息和用户行为记录,但是用户是一个基础模块,随着系统模块不断增加,会有越来越多的模块与之关联,按以上方案,每增加一个与用户相关的模块,那么删除用户时就要把这个模块的信息也一起删除,这样用户这个模块就与这些业务模块偶合在一起了,只要系统不断的增加或减少模块,用户模块就永远都改不完。(以上逻辑仅为说明问题)
如果采用事件监听,那么在删除一个用户时,发布一事件就完事了,所有相关的模块监听此事件,在事件处理中删除本模块对应的数据,那么用户模块也不会与这些模块有任何偶合了。
好,回到主题,
1、完全基于SPRING的事件监听与处理:
首先,SERVICE总接口类继承org.springframework.context.ApplicationListener接口,并且在SERVICE的抽象类中实现此接口的方法,SERVICE总接口代码:
SERVICE抽象类代码,所有具体业务类皆继承此抽象业务类
BaseEvent类是我自定义的一个类,各业务模块要发布事件,首先定义自已的EVENT类,继承BaseEvent。BaseEvent类代码
用户业务类UserSerivceImpl删除一个用户时,需要发布事件,所以要先定义一个UserDeleteEvent事件类
下面是UserSerivceImpl类删除用户的方法模拟
假如有一个OtherServiceImpl业务类需要接收用户删除事件并做一些处理,
到此,所有逻辑就完了,用户业务类中根本不需要知道谁将会处理此事件,所以完全与其它模块解偶了。
这里用了一个偷懒的方法,那就是在业务类的顶层接口IBaseService中实现了ApplicationListener接口,这样其实所有具体业务类都参与了所有事件的处理,即使是那些根本不需要监听事件的业务类。对于所有根本不需要监听事件的业务类,事件发生时就调用其父类空方法onBaseEvent,这里有一点性能浪费,如果改进?不要在顶层接口IBaseService中实现ApplicationListener接口,而是在具体的需要监听事件的业务类中实现此接口,但是这样还是有一点缺陷,那就是此具体业务类还是会监听到它不关心的事件,不论是用户删除事件还是用户修改事件,没办法,有得必有失,想要方便,肯定会有所牺牲。
如果只想监听到自已所关心的事件呢,那么就要自已实现一套事件处理的小框架了:
2、自定义的事件监听与处理框架。
首先重新定义事件监听器接口,不再使用SPRING提供的ApplicationListener接口:
这个接口比SPRING的事件接口多了一个方法。因为SPRING原来做法是只要实现了它提供的接口,任何事件发生时都会得到调用,这种做法是很方便使用的,这里沿用了这种思路。多出的那个方法作用是描述本类处理哪些事件。这时我需要一个类,这个类要在系统启动时把所有实现此接口的业务类找出来,归好类,以便事件发生时进行精确调用,并且提供事件发布事件的静态方法,这样我们才能知道事件在何时发生了。好,下面就来编写这个类
接着重新定义事件类本身,此类也不再继承SPRING的ApplicationEvent类,其它基本还和原来一样。
业务类顶层接改而继承自已的事件接口
在SERVICE的抽象类中去掉onApplicationEvent方法,不需要了,改写发布事件的方法,修改后变成这样
到此框架就完成了,UserServiceImpl删除用户时发布事件的代码还和原来一样,不需要改变,只是监听类要变一下,不再实现ApplicationListener接口,改而实现IBaseEventListener接口,不过不需要再具体类中实现,因为已经在顶层接口中继承了,代码
嗯,加个多线程处理倒是简单得很,可要考虑事务同步的问题上麻烦一些,最近都有没有这个时间去做啊,呵呵,有空还是要完善一下
是可以用Annoation实现,我本是想再搞个Annotation版的,一偷懒,还是算了,够用就行。
请问可以讲解一下如何实现吗??
是可以用Annoation实现,我本是想再搞个Annotation版的,一偷懒,还是算了,够用就行。
你是说在AOP中检测到是正在删除用户时,就调用其它的业务是吗?这样做确实也是可以的,可以将监听这个操作的类配置进来,但是这样就要对每一个被拦截的方法都要检查一下是否有监听者了,随着系统越来越大,监听者会越来越多,被监听的方法,不被监听的方法都会越来越多,每一个都检测一下就有点浪费了。
为何要使用事件监听,而不是直接调用?打个比方,在系统删除一个用户时,需要把用户的其他信息和行为记录一起删除,此时最容易想到的是:删除用户时,调用其他Service类接口删除与之相关的信息和用户行为记录,但是用户是一个基础模块,随着系统模块不断增加,会有越来越多的模块与之关联,按以上方案,每增加一个与用户相关的模块,那么删除用户时就要把这个模块的信息也一起删除,这样用户这个模块就与这些业务模块偶合在一起了,只要系统不断的增加或减少模块,用户模块就永远都改不完。(以上逻辑仅为说明问题)
如果采用事件监听,那么在删除一个用户时,发布一事件就完事了,所有相关的模块监听此事件,在事件处理中删除本模块对应的数据,那么用户模块也不会与这些模块有任何偶合了。
好,回到主题,
1、完全基于SPRING的事件监听与处理:
首先,SERVICE总接口类继承org.springframework.context.ApplicationListener接口,并且在SERVICE的抽象类中实现此接口的方法,SERVICE总接口代码:
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); } }
BaseEvent类是我自定义的一个类,各业务模块要发布事件,首先定义自已的EVENT类,继承BaseEvent。BaseEvent类代码
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(); } }
下面是UserSerivceImpl类删除用户的方法模拟
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()); } } }
到此,所有逻辑就完了,用户业务类中根本不需要知道谁将会处理此事件,所以完全与其它模块解偶了。
这里用了一个偷懒的方法,那就是在业务类的顶层接口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(); }
这个接口比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); } } } }
接着重新定义事件类本身,此类也不再继承SPRING的ApplicationEvent类,其它基本还和原来一样。
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{ }
在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; } }
到此框架就完成了,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; } }
评论
14 楼
loginwolf
2010-06-21
java 事件监听
13 楼
lgdlgd
2010-03-30
itstarting 写道
写的不错,考虑一下再进一步,加上具备异步处理能力的事件框架
嗯,加个多线程处理倒是简单得很,可要考虑事务同步的问题上麻烦一些,最近都有没有这个时间去做啊,呵呵,有空还是要完善一下
12 楼
itstarting
2010-03-30
写的不错,考虑一下再进一步,加上具备异步处理能力的事件框架
良好贴若干年前容易,现在难了:)
良好贴若干年前容易,现在难了:)
11 楼
lgdlgd
2009-12-04
呵呵,想弄个良好贴还真有点难啊...
10 楼
lgdlgd
2009-11-22
3、注解版实现:
1、定义注解类
2、在顶层接口IBaseService增加一个方法getRealClass,此方法用于返回真正的业务类字节码引用,此方法在抽象业务类用统一实现即可。本来不需要此方法,但由于使用了SPRING的AOP,一时没有找到取得真正业务类字节码引用的方法,所以才定义这么个接口,代码
抽象业务类的代码
改写IBaseEventListener接口,删除getEventClasses方法,因为使用注解来定义要处理事件,所以此方法不再需要。本来onBaseEvent方法也可以去除,直接由注解来定义即可,但由于以下原因,还是要保留:1、如果没有任何接口定义onBaseEvent方法,那么SPRING的代理类也不会有此方法,这样就无法使用AOP的种种好处了;2、为规范事件处理的方法名和参数,更易于后续维护,所以还是要有个接口定义为好。
事件处理工具类
好了,框架完成,事件发布还和以前那样,来看看事件处理的实现,同样也不再需要getEventClasses方法了
全部完成
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(); }
2、在顶层接口IBaseService增加一个方法getRealClass,此方法用于返回真正的业务类字节码引用,此方法在抽象业务类用统一实现即可。本来不需要此方法,但由于使用了SPRING的AOP,一时没有找到取得真正业务类字节码引用的方法,所以才定义这么个接口,代码
/** * 业务层顶层接口,自定义的小框架里可以在顶层业务接口中直接继承事件接口,不影响性能 * 因为在初始化事件监听器时,已经过滤了没有真正实现接口方法的类,所以不会造成多余的调用 */ 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){ //这里空实现,且没有注解,这样,如果具体业务类没有重写方法, //初始化事件监听器时就会被过滤掉,不会造成多余调用 } }
改写IBaseEventListener接口,删除getEventClasses方法,因为使用注解来定义要处理事件,所以此方法不再需要。本来onBaseEvent方法也可以去除,直接由注解来定义即可,但由于以下原因,还是要保留:1、如果没有任何接口定义onBaseEvent方法,那么SPRING的代理类也不会有此方法,这样就无法使用AOP的种种好处了;2、为规范事件处理的方法名和参数,更易于后续维护,所以还是要有个接口定义为好。
/** * 事件处理接口,实现此接口并且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; } }
好了,框架完成,事件发布还和以前那样,来看看事件处理的实现,同样也不再需要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{ //.... } } }
全部完成
9 楼
方世玉
2009-11-22
监听如果不结合异步操作,将是个灾难。
对比C#中的异步委托,方便太多了。
对比C#中的异步委托,方便太多了。
8 楼
smildlzj
2009-11-22
lgdlgd 写道
qbq 写道
AOP应该是可以
我还见过小鬼子用Annotation
对修改删除的记录保存到另一套以h_开头的表中
还加入是什么操作(C,U, D)
我还见过小鬼子用Annotation
对修改删除的记录保存到另一套以h_开头的表中
还加入是什么操作(C,U, D)
是可以用Annoation实现,我本是想再搞个Annotation版的,一偷懒,还是算了,够用就行。
请问可以讲解一下如何实现吗??
7 楼
wocsok
2009-11-20
恩 不错不错 事件驱动编程在JAVA的各个领域都很有用 实质类似观察者模式 只是这些类的引用被封装在SPRING容器里 而观察者是封装在自己继承的observable里 但是正是容器的这种公共提取而又不强关联 给开发者实现了几乎完全的模块间脱耦 spring的出现真是一场巨大的变革啊。
6 楼
lgdlgd
2009-11-19
qbq 写道
AOP应该是可以
我还见过小鬼子用Annotation
对修改删除的记录保存到另一套以h_开头的表中
还加入是什么操作(C,U, D)
我还见过小鬼子用Annotation
对修改删除的记录保存到另一套以h_开头的表中
还加入是什么操作(C,U, D)
是可以用Annoation实现,我本是想再搞个Annotation版的,一偷懒,还是算了,够用就行。
5 楼
lgdlgd
2009-11-19
whaosoft 写道
学习啦,这种情况用aop应该也能实现
你是说在AOP中检测到是正在删除用户时,就调用其它的业务是吗?这样做确实也是可以的,可以将监听这个操作的类配置进来,但是这样就要对每一个被拦截的方法都要检查一下是否有监听者了,随着系统越来越大,监听者会越来越多,被监听的方法,不被监听的方法都会越来越多,每一个都检测一下就有点浪费了。
4 楼
whaosoft
2009-11-19
学习啦,这种情况用aop应该也能实现
3 楼
qbq
2009-11-19
AOP应该是可以
我还见过小鬼子用Annotation
对修改删除的记录保存到另一套以h_开头的表中
还加入是什么操作(C,U, D)
我还见过小鬼子用Annotation
对修改删除的记录保存到另一套以h_开头的表中
还加入是什么操作(C,U, D)
2 楼
lijie250
2009-11-19
这种情况可以用AOP搞定不?
1 楼
yywu
2009-11-18
看了一遍,不错,谢谢了
相关推荐
Java事件处理框架是Java GUI(图形用户界面)编程中的一个重要组成部分,它允许开发者创建响应用户交互的程序。在传统的GUI编程中,事件处理通常涉及直接将事件监听器绑定到特定的组件,这样的代码往往难以维护且...
每个`Actor`都可以有自己的事件处理器,这样我们就可以针对特定的UI元素进行事件监听。`Actor`类继承了`InputListener`,可以直接处理触摸和鼠标事件。例如,我们可以使用`actor.addListener(new InputListener())`...
### Java GUI 事件监听知识点详解 #### 一、概述 在Java编程中,图形用户界面(GUI)的设计是一项重要的技能。对于初学者来说,掌握如何创建一个简单的界面,并且能够处理用户交互事件是非常必要的。本篇文章将...
这个库基于流行的Qt框架,为开发者提供了一个便捷的方式来监听并处理系统的输入事件,无论是来自应用程序内部还是外部。 在Qt中,通常我们可以通过继承`QWidget`类并重写其`mouseMoveEvent`、`mousePressEvent`、`...
在安卓应用开发中,事件监听是构建用户交互界面不可或缺的一部分。这一实例——"安卓事件监听实例",将深入探讨如何实现控件按钮点击以及其他常见用户交互的处理。面向对象编程和事件驱动编程是安卓开发的核心理念,...
本文档主要关注于ZK框架中的事件处理机制,包括事件监听、事件触发、事件转发等关键概念。通过这些机制,开发者可以更好地控制应用的行为,并实现复杂的交互逻辑。 #### 事件处理(Event Handling) ##### 事件监听...
在QT中,键盘输入处理是通过事件驱动模型实现的,我们可以利用QT提供的键盘事件来监听用户的键盘输入。本教程将详细介绍如何在QT中实现键盘监听,并重写监听事件。 首先,QT中的键盘事件主要有QEvent::KeyPress和...
在Spring框架中,事件监听是一种实现模块间解耦的有效手段,它允许我们在应用程序的不同部分之间传递消息,而无需直接依赖。本篇文章将详细介绍Spring事件监听的三种方式:基于接口的监听器、基于类的监听器以及基于...
JavaFX是Oracle公司推出的一个用于构建富客户端应用程序的开源框架,它是Java的一个部分,用于替代已经老化的Swing应用程序框架。在JavaFX中,窗口(Stage)是场景(Scene)的容器,场景是实际的UI布局内容,如按钮...
在Spring框架中,`ApplicationContext`不仅是一个容器,用于管理Bean的生命周期和依赖注入,它还提供了事件发布和监听的功能。这个特性使得Spring应用能够实现组件间的异步通信,类似于消息队列(MQ)的工作模式。...
Servlet事件监听器和JSP是Java Web开发中的重要组成部分,它们在构建动态网站时起着核心作用。Servlet事件监听器允许开发者对特定的Servlet容器事件做出反应,而JSP则是用于创建动态网页的简便方式。这里我们将深入...
它通过创建一个基类`BaseNetwork`,将网络监听的注册、注销和事件处理进行了封装,方便其他组件继承并自定义网络状态变化时的行为。在实际开发中,这样的框架可以帮助我们更高效地处理网络状态变化,提高应用的用户...
这里我们将使用Spring Data Redis的`ExpirationPolicy`接口来设置Key的过期时间,并通过`@EventListener`注解监听`ApplicationEvent`来触发过期事件处理: ```java @Service public class RedisService { @...
Spring事件监听机制是Spring框架中的一个重要特性,它基于经典的观察者模式,允许应用程序组件之间进行松耦合的通信。在Spring中,事件监听机制由三部分组成:事件(ApplicationEvent)、事件监听器(Application...
在Spring Boot框架中,事件监听是一种重要的组件交互方式,它允许开发者在应用程序的不同部分之间传递信息,无需直接耦合。本文将深入探讨Spring Boot事件监听的源码实现,并通过一个案例示例来阐述其工作原理。 ...
现在更推荐的做法是使用原生JavaScript的DOMContentLoaded事件或者在现代JavaScript框架中处理事件监听。 在代码示例中,i和j两个变量被用作标志位,每次对应的事件触发时,标志位递增。这里存在一个逻辑问题,因为...
在Spring框架中,事件监听机制是一种非常重要的组件间通信方式,它允许应用程序的不同部分通过发布和订阅事件来进行异步通信。这种模式使得组件之间松耦合,提高了代码的可维护性和可扩展性。下面我们将详细探讨...
2. **事件监听**:除了消息处理,小栗子还能监听QQ的各种事件,比如成员入群、退群、管理员操作等。开发者可以据此实现更智能的自动化管理功能。 3. **插件机制**:小栗子框架允许开发者编写插件来扩展其功能。这些...
"C# Hook 钩子"就是这样一个专题,它允许开发者创建一个全局监听程序,来捕获并处理系统的键盘和鼠标事件。 钩子是一种机制,由Windows操作系统提供,它允许应用程序设置一个或多个“钩子”,以便拦截特定类型的...
Layui是一款轻量级的前端框架,它提供了丰富的组件和便利的API,其中事件监听是其核心功能之一,特别在处理表单和数据表格时显得尤为重要。本文将深入讲解Layui中事件监听的实现,主要关注表单和数据表格。 **一、...