• 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。

  • 相关阅读:
    机器学习项目流程
    机器学习之数据归一化问题
    python三数之和
    从不订购的客户
    case when then的用法-leetcode交换工资
    .NET Core Api 集成 swagger
    .NET CORE 2.1 导出excel文件的两种方法
    Dapper的基本使用
    (转)深入研究MiniMVC之后续篇
    (转)深入研究 蒋金楠(Artech)老师的 MiniMvc(迷你 MVC),看看 MVC 内部到底是如何运行的
  • 原文地址:https://www.cnblogs.com/w-wfy/p/5868665.html
Copyright © 2020-2023  润新知