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事件

特点: 简单很多

posted @ 2020-09-26 23:38  自然的风和雨  阅读(559)  评论(0)    收藏  举报