Java事件监听
事件监听的概念:
事件监听就是让电脑通过你的操作得到一些数据并对这些数据做出反应,反馈相应的行为或者指令的操作。
java中的事件机制的参与者有3种角色;
Spring监听器
Spring的件监听是基于观察者模式。遵发布-订阅模型。
意思就是:发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。T该模型主要由四个角色组成:
Spring框架早已得供了完善的事件监听机制在Spring框架中实现事件监听的流程如下:
package com.zuxia.event;
import org.springframework.context.ApplicationEvent;
public class CustomEvent extends ApplicationEvent {
public CustomEvent(Object source){
super(source);
}
public void printMessage(String msg){
System.out.println("自定义事件:打印信息"+msg);
}
}
package com.zuxia.listener;
import com.zuxia.event.CustomEvent;
import org.springframework.context.ApplicationListener;
public class CustomListener1 implements ApplicationListener<CustomEvent> {
@Override
public void onApplicationEvent(CustomEvent event) {
event.printMessage("CustomListener1监听到了");
}
}
package com.zuxia;
import com.zuxia.listener.CustomListener1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class SpringBootEventListerApplication {
public static void main(String[] args) {
//方法一:获取启动器的容器 加载自定义监听器
ConfigurableApplicationContext context=SpringApplication.run(SpringBootEventListerApplication.class, args);
context.addApplicationListener(new CustomListener1());
}
}
方式二:自定义类实现ApplicationListenser接口,在接口上注解@Component
package com.zuxia.listener;
import com.zuxia.event.CustomEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
/**
* 方式二:通过@Component声明这是一个需要加载的监听器
*/
@Component
public class CustomListener2 implements ApplicationListener<CustomEvent> {
@Override
public void onApplicationEvent(CustomEvent event) {
event.printMessage("CustomListener2监听到了");
}
}
方式三:白定义类不需要实现接口,在方法上标明@EventListener注解(十蓉通过
EventListenerMethodProcessor扫描出所有带有此注解的方法,然后动态构造事件监听器,并将监听器托管到Spring应用上文中)
package com.zuxia.listener;
import com.zuxia.event.CustomEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
/**
* 方式三
* 不需要实现AppicationListener接口
* 但是声明当前类是@Component组件,需要被加载
* 通过在方法上增加@EventListener注解,声明这是一个监听组件,监听的事件是方法的参数
*/
@Component
public class CustomListener3 {
@EventListener
public void evnetList(CustomEvent event){
event.printMessage("CustomListener3监听到了");
}
}
方式四:在application.properties中置context.listener.classes (DelegatingApplicationListener,该尖的作用是从application.properties中读取配置context.listener.classes,并将事件广给这些配置的监听
package com.zuxia.listener;
import com.zuxia.event.CustomEvent;
import org.springframework.context.ApplicationListener;
public class CustomListener4 implements ApplicationListener<CustomEvent> {
@Override
public void onApplicationEvent(CustomEvent event) {
event.printMessage("CustomListener4执行了");
}
}
application.yml
server:
port: 8080
#方式四:通过配置方使加载监听器
context:
listener:
classes: com.zuxia.listener.CustomListener4
SpringBoot事件监听的步骤:
方法四------方法三-------方法二-------------方法一
SpringBoot事件监听机制
SpringApplicationRunListrner用于监听SpringApplication的run方法的执行。
定义了5个步照:
目前只有一个实现类EventPublishingRunListener,它把监听的过程过装成了SpringApplicationEvent事并通过内部属性广播出去,属性名为initialMulticaster,是ApplicationEventMulticaster接口的实现类
SimpleApplicstionEventMulticaster.广播出去的事件对象会被SpringApplication中的listeners属性进行处理