springboot -03 事件监听

  在实际的开发中,常常遇到这种场景:

当某件事情完成后,需要通知其他的模块进行相应的处理。我们可以一个一个的发送请求去通知,但是更好的处理方式是通过事件监听来完成。事件监听是基于设计模式中的发布-订阅,观察者模式来实现的。

接下来我们基于springboot来讲述自定义事件监听的流程。

  1. 配置自定义事件: MyEvent   extends  ApplicationEvent
  2. 配置自定义监听器: MyApplicationListener implements ApplicationListener
  3. 事件发布 : 利用spring容器进行事件发布:context.publishEvent

其中 2 配置自定义监听器有四种方式:

2.1: 继承ApplicationEvent 重写 onApplicationEvent,当前bean必须注入到spring容器中。

public class MyEvent extends ApplicationEvent {

    public MyEvent(Object source) {
        super(source);
    }
}

@Component
public class MyApplicationListener implements  ApplicationListener{

    public void onApplicationEvent(ApplicationEvent event) {
        System.out.println(event.getSource());
        System.out.println(event.getClass().getName());
    }
}

2.2: 继承ApplicationEvent 重写 onApplicationEvent,利用容器转载监听器 context.addApplicationListener(new MyApplicationListener());

public class MyEvent extends ApplicationEvent {

    public MyEvent(Object source) {
        super(source);
    }
}

public class MyApplicationListener implements  ApplicationListener{

    public void onApplicationEvent(ApplicationEvent event) {
        System.out.println(event.getSource());
        System.out.println(event.getClass().getName());
    }
}

@SpringBootApplication(scanBasePackages = "com.example.eventListener")
public class SpringbootApplication_listener {

    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(SpringbootApplication_listener.class);
        ConfigurableApplicationContext context = springApplication.run(args);
        context.addApplicationListener(new MyApplicationListener());
        context.publishEvent(new MyEvent("测试事件监听"));

      //  context.close();
    }
}

2.3: 继承ApplicationEvent 重写 onApplicationEvent,配置文件中添加监听器:

public class MyEvent extends ApplicationEvent {

    public MyEvent(Object source) {
        super(source);
    }
}

public class MyApplicationListener implements  ApplicationListener{

    public void onApplicationEvent(ApplicationEvent event) {
        System.out.println(event.getSource());
        System.out.println(event.getClass().getName());
    }
}

application.yml

context:
  listener:
    classes: com.example.eventListener.MyApplicationListener

2.4:利用注解@EventListener,可以自定义多个方法,该类不需要继承ApplicationEvent,当前类必须注入到spring容器中。

public class MyEvent extends ApplicationEvent {

    public MyEvent(Object source) {
        super(source);
    }
}

@Component
public class MyApplicationListener {

    @EventListener
    public void onApplicationEvent11(ApplicationEvent event) {
        System.out.println(event.getSource());
        System.out.println(event.getClass().getName());
    }
}



猜你喜欢

转载自www.cnblogs.com/chenzhubing/p/11302484.html