spring定义事件有两种方式:
- 继承
ApplicationEvent
java
public class MyEvent01 extends ApplicationEvent {
/**
* 携带自己的数据
*/
private String name;
private Integer age;
/**
*
* @param source 事件源,,事件是由谁发送的
*/
public MyEvent01(Object source) {
super(source);
}
...
}
- 随便创建一个类
java
public class User {
private String name;
private Integer age;
...
}
spring监听事件也有两种方式:
- 实现
ApplicationListener<要监听的事件类型>
java
// 范性 ==》 监听器处理的类型
@Component
public class MyListener01 implements ApplicationListener<MyEvent01> {
@Override
public void onApplicationEvent(MyEvent01 event) {
// 获取事件是由哪里发出来的
Object source = event.getSource();
System.out.println("source = " + source);
System.out.println("event my listener01 = " + event);
}
}
- 使用
@EventListener(要监听的事件类型)
java
@Component
public class MyListener02 {
/**
* 指定要监听 这个 user 事件
* @param user
*/
@EventListener(User.class)
public void handleUser(User user){
System.out.println("user my listener02 = " + user);
}
}
spring事件发布是通过ApplicationEventPublisher
来发布事件,,,
因为ApplicationContext
实现了ApplicationEventPublisher
,可以直接使用ApplicationContext
发布事件
java
@Test
void contextLoads() {
User user = new User();
user.setName("user");
user.setAge(1);
context.publishEvent(user);
// MyEvent01 event01 = new MyEvent01(this);
// event01.setName("waterkid");
// event01.setAge(18);
// context.publishEvent(event01);
}
或者通xxxAware
感知到ApplicationEventPublisher
来发布事件:
java
@Component
public class MyEventPublisher implements ApplicationEventPublisherAware {
private static ApplicationEventPublisher publisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
publisher = applicationEventPublisher;
}
public static void publishEvent(Object event){
publisher.publishEvent(event);
}
public static void publishEvent(ApplicationEvent event){
publisher.publishEvent(event);
}
}
java
@Test
public void test01(){
User user = new User();
user.setName("user");
user.setAge(1);
MyEventPublisher.publishEvent(user);
}
spring中监听事件,,也可以写在容器外面,,通过ConfigurableApplicationContext
去添加监听器:
java
@Test
public void test02(){
ConfigurableApplicationContext ctx = (ConfigurableApplicationContext) context;
// 添加监听器
ctx.addApplicationListener(new ApplicationListener<ApplicationEvent>(){
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof MyEvent01){
System.out.println("event = " + event);
}else if(event instanceof AfterTestMethodEvent || event instanceof AfterTestExecutionEvent){
// spring测试框架在测试执行过程中,会触发一些列内置事件,,这是框架的设计和重要机制
// AfterTestExecutionEvent : 测试方法主体执行完成后,但在清理方法之前
// AfterTestMethodEvent : 测试方法完全结束
}
else {
// spring测试框架在测试执行过程中,会触发一些列内置事件,,这是框架的设计和重要机制
// AfterTestExecutionEvent : 测试方法主体执行完成后,但在清理方法之前
// AfterTestMethodEvent : 测试方法完全结束
System.out.println("其他事件 = " + event);
}
}
});
MyEvent01 event01 = new MyEvent01(this);
event01.setName("waterkid");
event01.setAge(18);
context.publishEvent(event01);
}