Spring中的ApplicationContext事件机制

Spring中的ApplicationContext事件机制

​ 今天看到了ac.publishEvent(event)的写法,这个事件处理机制在学习中没有怎么去写,公司里面是用来处理与主程序无关的流程,这里想到了平时用的比较多的异步线程去处理的方式,今天来学习ApplicationContext事件机制.

理解

​ ApplicationContext的事件机制是观察者设计模式的实现,通过 ApplicationEvent 类和 ApplicationListener 接口,可以实现 Application Context 的事件处理。如果容器中有一个 ApplicationListener Bean 每当 ApplicationContext 发布 ApplicationEvent时,ApplicationListene r Bean将自动触发,主要有两个成员: ①ApplicationEvent: 容器事件 ②ApplicationListener: 监听器

下图简单示范了ApplicationContext事件

图片

代码演示

​ 程序先定义了一个ApplicationContext类,其对象就是一个Spring容器事件。代码如下:

import org.springframework.context.ApplicationEvent;

public class EmailEvent extends ApplicationEvent{

    private static final long serialVersionUID = -7056841418193254583L;

    private String address;
    private String text;
    public EmailEvent(Object source) {
        super(source);
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getText() {
        return text;
    }
    public void setText(String text) {
        this.text = text;
    }

}

​ 上面的EmailEvent类继承了ApplicationContext类,除此之外,它就是一个普通的Java类。

​ 容器的监听器必须实现ApplicationListener接口,实现该接口必须实现方法: onApplicationEvent(ApplicationEvent event) 每当容器内发生任何事件时,此方法都被触发。

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
@Bean
public class EmailNotifier implements ApplicationListener<ApplicationEvent>{

    //该方法会在容器发生事件时自动触发
    public void onApplicationEvent(ApplicationEvent event) {
        if(event instanceof EmailEvent){
            //只处理EmailEvent,发送Email通知...
            EmailEvent emailEvent = (EmailEvent)event;
            System.out.println("需要发送的邮件的接收地址:"+emailEvent.getAddress());
            System.out.println("需要发送邮件的邮件正文:"+emailEvent.getText());
        }else{
            //容器内置时间不做任何处理
            System.out.println("容器本身事件: "+event);
        }
    }

}

​ 从上面的配置文件中可以看出,为Spring容器注册事件监听器。当我们在Spring配置了一个实现ApplicationListener的Bean。Springl容器就会把这个Bean当初容器的监听器。

​ 当系统创建Spring容器,加载Spring容器时会自动触发容器事件,容器事件监听器可以监听到这些事件。除此之外,程序也可调用ApplicationContext的publishEvent方法来主动触发容器事件。如下主程序使用ApplicationContext的publishEvent来触发事件。

ApplicationContext ac = new ClassPathXmlApplicationContext("/applicationContext.xml");
        //创建一个ApplicationEvent对象 或者注入
        EmailEvent ele = new EmailEvent("Hello");
        ele.setAddress("123456@163.com");
        ele.setText("Hello World");
        //主动触发容器事件
        ac.publishEvent(ele);

​ 上面的代码通过ApplicationContext对象的publishEvent主动触发该事件。运行上面的程序将看到如下执行结果。

1 容器本身事件: org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@141b571: startup date [Fri Sep 13 10:16:01 CST 2013]; root of context hierarchy]
2 需要发送的邮件的接收地址:123456@163.com
3 需要发送邮件的邮件正文:Hello World

总结

解耦业务逻辑:利用ApplicationContext 事件机制,可以解除代码耦合。

异步处理:某些操作可以通过事件机制异步处理,提升系统响应速度。

扩展性:可以很容易地添加新的事件处理器,而不会影响现有代码。


Spring中的ApplicationContext事件机制
http://example.com/2024/07/24/Spring中的ApplicationContext事件机制/
作者
Zhangqs
发布于
2024年7月24日
许可协议