Spring的事件机制详解
优势
- 解耦
- 对同一种事件有多种处理方式
- 不干扰主线(main line)
起源
要讲spring的事件通知机制,就要先了解一下spring中的这些接口和抽象类:
- ApplicationEventPublisherAware 接口:用来 publish event
- ApplicationEvent 抽象类,记录了source和初始化时间戳:用来定义Event
- ApplicationListener
:用来监听事件 事件监听器接口,事件的业务逻辑封装在监听器里面
/**
* @描述 :监听的信息体
* @作者 fangdayang
* @date 2020/9/26 21:57
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SendSSM implements Serializable{
private static final long serialVersionUID = -8166835404556969239L;
private String address;
private String content;
private Date sendTime;
}
/**
* @描述 :监听的事件
* @作者 fangdayang
* @date 2020/9/26 22:07
*/
public class SendEvent extends ApplicationEvent {
private String extra;
/**
* Create a new ApplicationEvent.
*
* @param sendSSM the object on which the event initially occurred (never {@code null})
*/
public SendEvent(SendSSM sendSSM,String extra) {
super(sendSSM);
this.extra = extra;
}
public String getExtra() {
return extra;
}
@Override
public String toString() {
return "SendEvent{" +
"extra='" + extra + '\'' +
", source=" + source +
'}';
}
}
/**
* @描述 :监听器
* @作者 fangdayang
* @date 2020/9/26 22:10
*/
@Component
public class SendSSMListener implements ApplicationListener<SendEvent> {
@Override
public void onApplicationEvent(SendEvent event) {
System.out.println("监听器,监听的事件如下: "+event);
}
}
/**
* @描述 :推送信息
* @作者 fangdayang
* @date 2020/9/26 22:14
*/
@Component
public class SendSSMPublisher implements ApplicationEventPublisherAware {
private ApplicationEventPublisher applicationEventPublisher;
public void publish(SendEvent sendEvent){
applicationEventPublisher.publishEvent(sendEvent);
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher=applicationEventPublisher;
}
}
/**
* @描述 :测试类
* @作者 fangdayang
* @date 2020/9/26 22:19
*/
public class TestMain {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config2.xml");
SendSSMPublisher sendSSMPublisher = applicationContext.getBean(SendSSMPublisher.class);
System.out.println("start ===============================");
SendEvent event= new SendEvent(new SendSSM("三围","面试",new Date()),"额外的属性");
sendSSMPublisher.publish(event);
System.out.println("end ===============================");
}
}
springBoot的实际操作spring事件
特点: 简单很多


浙公网安备 33010602011771号