2019.12.5笔记——Spring中监听器的使用与分析、模拟实现监听器和配置线程池

本文详细介绍了Spring监听器的使用,包括自定义事件和监听器,以及通过继承和注解两种方式实现监听。同时,文章分析了Spring监听器的底层实现,探讨了事件管理器的工作原理。此外,还讲解了如何在Spring中配置线程池以异步执行监听器逻辑。
摘要由CSDN通过智能技术生成

Spring监听器的使用

可以参考下面的文章
《观察者设计模式(含jdk和spring实现的)》

  • 事件

我们不仅可以使用spring给我们定义好的事件,我们自己也可以自定义一个事件,只需要继承一个spirng的事件类ApplicationEvent就可以了,想了解更详细的可以参考上面的文章。

比如下面就是一个简单的事件

public class MyContextEvent extends ApplicationEvent {
   

	/**
	 * Create a new ApplicationEvent.
	 *
	 * @param source the object on which the event initially occurred (never {@code null})
	 */
	public MyContextEvent(Object source) {
   
		super(source);
	}
}
  • 监听器

同样的我们需要一个监听器去监听这个事件,在spring中提供了两种方式去监听事件,一种是继承的方式,一种是注解的方式,这两种方式形式上不同,但底层实现是一样的,这个会放在后面分析。

  1. 继承的方式

我们可以通过接口ApplicationListener接口的方式实现监听,在泛型中我们可以指定需要监听的事件。

下面的监听器就监听了上面我们自定义的事件,如果出发了事件,spring就会主动去调用下面的onApplicationEvent方法,通过MyContextEvent参数我们可以拿到事件源和事件对象。

@Component
public class MyContextEventListener implements ApplicationListener<MyContextEvent> {
   

    @Override
    public void onApplicationEvent(MyContextEvent myContextEvent) {
   
        System.out.println("事件源:"+myContextEvent.getSource());
        System.out.println("触发事件");
    }
}
  1. 注解的方式

这种方式更加简单,只需要在一个方法上加上@EventListener注解就可以了,然后在参数中指定需要监听的事件就可以了,这个方法就相当于上面的onApplicationEvent方法。

@Component
public class MyContextEventListener{
   
    @EventListener
    public void onEvent(MyContextEvent event){
   
        System.out.println("事件源:"+event.getSource());
        System.out.println("触发事件");
    }

}
  • 触发事件

最后就是触发事件了

@Component
public class Trigger {
   

    // spring容器
    @Autowired
    ApplicationContext applicationContext;

    /**
     * 触发事件
     */
    public void trigEvent(){
   
        // 触发事件
        applicationContext.publishEvent(new MyContextEvent(applicationContext));
    }
}

自己实现事件与监听

通过上面spring的监听器的使用,我们也可以自己实现一个监听器,同样实现spring的监听功能。

  • 事件

首先我们也需要像spring中的ApplicationEvent一样的事件父类,这里就定义了一个空的事件类。

public class ApplicationEvnt {
   
}

然后我们就可以创建一个事件类,同样是继承上面这个类。

public class AEvent extends ApplicationEvnt {
   
}
  • 监听器

监听器我们同样需要一个接口才能统一规定标准,也为了更好的抽象,下面就是监听器的接口

public interface ApplicationListener< E extends ApplicationEvnt  > {
   
//    void  onEvnts(String ... a);
    void onEvnt(E e);
}

然后创建一个监听AEvent事件的监听器

public class AListener  implements ApplicationListener<AEvent>{
   
    @Override
    public void onEvnt(AEvent aEvent) {
   
        System.out.println("监听到了A事件");
    }
}
  • 事件管理器

我们还需要一个事件管理器,这个类在spring中也是同样存在的,负责在我们在触发事件的时候将调用监听器的方法。

在这个类中会保存所有的监听器,并且事件的触发也就由它实现的,在触发的时候就会根据事件类型回调相应的监听器方法。

//事件管理器
public class ListenerManage {
   

    //保存所有的监听器
    static
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值