Spring的事件框架有如下两个重要的成员:
- ApplicationEvent:容器事件,必须由ApplicationContext发布
- ApplicationListener:监听器,可由容器中的任何监听器Bean担任
总的来说spring的事件机制主要包括四个步骤
1.编写ApplicationEvent类的子类,这就是我们的事件类
2.编写监听器类,这个类要实现ApplicationListener接口
3 将监听器配置在Spring的容器中
4.调用ApplicationContext的publishEvent()方法来主动触发一个容器事件,或者spring的一些内置事件发生
下面是applicationcontext事件机制的一个例子
1.ApplicationEvent类的子类
import org.springframework.context.ApplicationEvent;
public class SpringEvent extends ApplicationEvent {
private String Address;
private String text;
public SpringEvent(Object source,String Address,String text) {
super(source);
// TODO Auto-generated constructor stub
this.Address=Address;
this.text=text;
}
public SpringEvent(Object source) {
super(source);
// TODO Auto-generated constructor stub
}
public String getAddress() {
return Address;
}
public void setAddress(String address) {
Address = address;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
2.监听器类
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
public class EmailNotifier implements ApplicationListener {
@Override
public void onApplicationEvent(ApplicationEvent arg0) {
// TODO Auto-generated method stub
if(arg0 instanceof SpringEvent) {
SpringEvent event=(SpringEvent) arg0;
System.out.println("address"+event.getAddress());
System.out.println("text"+event.getText());
}
else {
System.out.println("容器本身事件"+arg0);
}
}
}
3.在配置文件中注册
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="EmailNotifier"></bean>
</beans>
4.发布事件
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Eveanttest {
public static void main(String []args) {
ApplicationContext Context=new ClassPathXmlApplicationContext("bean.xml");
SpringEvent springEvent=new SpringEvent("hello","abc@163.com","this is text");
Context.publishEvent(springEvent);
}
}
5.执行结果
第一条输出为spring的内置事件发生,下面为大家介绍spring的几种内置事件
1.ContextRefreshedEvent:ApplicationContext容器初始化或刷新时触发该事件。此处的初始化是指:所有的Bean被成功装载,后处理Bean被检测并激活,所有Singleton Bean 被预实例化,ApplicationContext容器已就绪可用
2.ContextStartedEvent:当使用ConfigurableApplicationContext(ApplicationContext的子接口)接口的start()方法启动ApplicationContext容器时触发该事件。容器管理声明周期的Bean实例将获得一个指定的启动信号,这在经常需要停止后重新启动的场合比较常见
3.ContextClosedEvent:当使用ConfigurableApplicationContext接口的close()方法关闭ApplicationContext时触发该事件
4.ContextStoppedEvent:当使用ConfigurableApplicationContext接口的stop()方法使ApplicationContext容器停止时触发该事件。此处的停止,意味着容器管理生命周期的Bean实例将获得一个指定的停止信号,被停止的Spring容器可再次调用start()方法重新启动
5.RequestHandledEvent:Web相关事件,只能应用于使用DispatcherServlet的Web应用。在使用Spring作为前端的MVC控制器时,当Spring处理用户请求结束后,系统会自动触发该事件。
我们刚触发的就是ContextRefreshedEvent事件