zoukankan      html  css  js  c++  java
  • Spring中ApplicationContext对事件的支持

    Spring中ApplicationContext对事件的支持

     

    ApplicationContext具有发布事件的能力。这是因为该接口继承了ApplicationEventPublisher接口。Spring中与事件有关的接口和类主要包括ApplicationEvent、ApplicationListener。
    定义一个事件的类需要继承ApplicationEvent或者ApplicationContextEvent抽象类,该抽象类中只有一个构造函数,并 且带有一个Object类型的参数作为事件源,并且该事件源不能为null,因此我们需要在自己的构造函数中执行super(Object)。

    public class UserEvent extends ApplicationEvent
    {
       private String eventContent;
       public String getEventContent(){
          return eventContent;
       }
       public void setEventContent(String eventContent){
          this.eventContent = eventContent;
       }
       public UserEvent(Object source,String eventContent){
          super(source);
          this.eventContent = eventContent;
       }
    }

     
    针对一种事件,可能需要特定的监听器,因此,监听器需要实现ApplicationListener接口。当监听器接收到一个事件的时候,就会执行它的 onApplicationEvent()方法。由于Spring IoC中的事件模型是一种简单的、粗粒度的监听模型,当有一个事件到达时,所有的监听器都会接收到,并且作出响应,如果希望只针对某些类型进行监听,需要 在代码中进行控制。

    public class UserListener implements ApplicationListener
    {
       public void onApplicationEvent(ApplicationEvent event){
          if(event instanceof UserEvent){ //只对UserEvent类型进行处理
             UserEvent ue = (UserEvent)event;
             String result = ue.getEventContent();
             System.out.println("Event Content:"+result);
          }
       }
    }

     
    对于发布事件,我们可以实现ApplicationContextAware或者ApplicationEventPublisherAware接口。

    public class UserBiz implements ApplicationContextAware
    {
    private ApplicationContext applicationContext;
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
    {
        this.applicationContext = applicationContext; 
    }
    public void service(String thing)
    {
        UserEvent event = new UserEvent(this,thing);
        event.setEventContent("I shoud "+thing);
        applicationContext.publishEvent(event);
    }   
    }

     
    或者如下:

    public class UserBiz2 implements ApplicationEventPublisherAware
    {
        private ApplicationEventPublisher applicationEventPublisher;
        public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher)
        {
            this.applicationEventPublisher = applicationEventPublisher;
        }
        public void service(String thing)
        {
            UserEvent event = new UserEvent(this,thing);
            event.setEventContent("I shoud "+thing);
            applicationEventPublisher.publishEvent(event);
        }
    }

     
    至此便完成了事件的发布,当ApplicationContext接收到事件后,事件的广播是Spring内部给我们做的,不需要了解具体的细节。其实在 Spring读取配置文件之后,利用反射,将所有实现ApplicationListener的Bean找出来,注册为容器的事件监听器。当接收到事件的 时候,Spring会逐个调用事件监听器。剩下要做的就是在配置文件中配置监听器。
    <bean class="footprint.spring.ioc.event.UserListener"/>
    Spring容器自身会发布一些事件,包括ContextClosedEvent、ContextRefreshedEvent、ContextStartedEvent、ContextStoppedEvent。

  • 相关阅读:
    MIne FirstBlog
    P6563 [SBCOI2020]一直在你身旁
    P6563 [SBCOI2020]一直在你身旁
    T122085 [SBCOI2020]时光的流逝
    LC 918. Maximum Sum Circular Subarray
    1026 Table Tennis
    LC 1442. Count Triplets That Can Form Two Arrays of Equal XOR
    LC 1316. Distinct Echo Substrings
    LC 493. Reverse Pairs
    1029 Median (二分)
  • 原文地址:https://www.cnblogs.com/w-wfy/p/5868665.html
Copyright © 2011-2022 走看看