一、Spring自定义事件注解版
可用于代码解耦,例如:购买会员支付成功,发布订单支付成功事件。然后多个监听器开始执行:增加会员天数 --> 发送购买成功消息 --> 通知对账系统同步数据 。等等等等
二、使用步骤
1.创建自定义事件
代码如下(示例):
import lombok.Getter;
import lombok.Setter;
import org.springframework.context.ApplicationEvent;
/**
* 自定义事件
*
* @author
* @date 2021/1/29 14:32
*/
@Getter
@Setter
public class MyEvent extends ApplicationEvent {
/**
* 自定义事件
*/
public MyEvent(MyOrder myOrder) {
super(myOrder);
}
}
2.创建监听器
@EventListener 注解,表示该方法为监听方法
@Order注解,表示执行顺序,可不添加。不添加就无法控制其执行顺序
@Async注解,可开启监听方法的异步执行,加了该注解则@Order无效
package com.ivan.event.listener;
import com.ivan.event.event.MyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
/**
* @author
* @date 2021/1/29 14:39
*/
@Component
public class MyEventListener {
@EventListener
@Order(20)
public void listen1(MyEvent myEvent){
System.out.println("监听器1:"+myEvent.getSource());
}
@EventListener
@Order(19)
public void listen2(MyEvent myEvent){
System.out.println("监听器2:"+myEvent.getSource());
}
}
3.发布事件
代码如下(示例):
package com.ivan.event;
import com.ivan.event.dto.Order;
import com.ivan.event.event.MyEvent;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
@SpringBootTest
class EventDemoApplicationTests {
@Autowired
private ApplicationContext applicationContext;
@Test
void contextLoads() {
Order order=new Order().setId(1L).setName("牛逼").setPrice("100.5");
MyEvent myEvent = new MyEvent(order);
applicationContext.publishEvent(myEvent);
System.out.println(1);
}
}
运行结果(示例):
总结
1、多个监听器默认是同步执行的,且先后执行顺序不一定
2、若要指定执行顺序则可以添加@Order注解,@Order值越小越优先执行
3、若要实现异步执行则在方法上添加 @Async 即可。(记得在Application上添加 @EnableAsync 注解,表示开启异步)。若在监听方法上加了@Async 则这个方法的 @Order注解不生效