zoukankan      html  css  js  c++  java
  • Spring中ApplicationListener的使用

    背景

    ApplicationListener是Spring事件机制的一部分,与抽象类ApplicationEvent类配合来完成ApplicationContext的事件机制。

    如果容器中存在ApplicationListener的Bean,当ApplicationContext调用publishEvent方法时,对应的Bean会被触发。这一过程是典型的观察者模式的实现。

    ApplicationListener源码

    @FunctionalInterface
    public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
    
    	/**
    	 * Handle an application event.
    	 * @param event the event to respond to
    	 */
    	void onApplicationEvent(E event);
    
    }
    

    ContextRefreshedEvent事件的监听

    以Spring的内置事件ContextRefreshedEvent为例,当ApplicationContext被初始化或刷新时,会触发ContextRefreshedEvent事件,下面我们就实现一个ApplicationListener来监听此事件的发生。

    @Component // 需对该类进行Bean的实例化
    public class LearnListener implements ApplicationListener<ContextRefreshedEvent> {
       @Override
       public void onApplicationEvent(ContextRefreshedEvent event) {
          // 打印容器中出事Bean的数量
          System.out.println("监听器获得容器中初始化Bean数量:" + event.getApplicationContext().getBeanDefinitionCount());
       }
    }
    
    

    如上,便完成了一个事件监听类的实现和实例化。

    自定义事件及监听

    首先自定义事件:NotifyEvent。

    public class NotifyEvent extends ApplicationEvent {
    
    
    	private String email;
    
    	private String content;
    
    	public NotifyEvent(Object source) {
    		super(source);
    	}
    
    	public NotifyEvent(Object source, String email, String content) {
    		super(source);
    		this.email = email;
    		this.content = content;
    	}
        // 省略getter/setter方法
    }
    

    定义监听器NotifyListener:

    @Component
    public class NotifyListener implements ApplicationListener<NotifyEvent> {
    
    	@Override
    	public void onApplicationEvent(NotifyEvent event) {
    		System.out.println("邮件地址:" + event.getEmail());
    		System.out.println("邮件内容:" + event.getContent());
    	}
    }
    

    监听器通过@Component注解进行实例化,并在onApplicationEvent中打印相关信息。

    单元测试类:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class ListenerTest {
    
    	@Autowired
    	private WebApplicationContext webApplicationContext;
    
    	@Test
    	public void testListener() {
    
    		NotifyEvent event = new NotifyEvent("object", "abc@qq.com", "This is the content");
    
    		webApplicationContext.publishEvent(event);
    	}
    }
    

    执行单元测试,会发现事件发布之后,监听器方法被调用,日志被打印出来。

    原文链接:https://www.choupangxia.com/2019/07/17/spring中applicationlistener的使用/

    csdn-微信公众号

  • 相关阅读:
    Vue 监听子组件事件
    延时队列
    AES加密
    centos7.9 iftop 工具源码安装
    angular pass get paragrams by router
    Android chrome console in PC
    powershell 运行带路径的exe
    win下 nrm ls报错
    windows10 安装 node 16 解决node-sass node-gyp报错
    位图和布隆过滤器
  • 原文地址:https://www.cnblogs.com/secbro/p/11199936.html
Copyright © 2011-2022 走看看