Spring-ApplicationContext的事件机制
事件源:ApplicationContext。publishEvent()方法:用于主动触发容器事件。
事件:ApplicationEvent类,容器事件,必须由ApplicationContext发布。
事件监听器:ApplicationListener接口,可由容器中任何监听器Bean担任。onApplicationEvent(ApplicationEvent event):每当容器内发生任何事件时,此方法都被触发
容器事件类需继承ApplicationEvent类,容器事件的监听器类需实现ApplicationListener接口。
下面给出一个例子(防止看我博客的小白错误包的导入 加上了包代码)
1.首先定义一个EmailEvent类,继承ApplicationEvent类
import org.springframework.context.ApplicationEvent;
public class EmailEvent extends ApplicationEvent {
private String address;
private String text;
public EmailEvent(Object source) {
super(source);
}
public EmailEvent(Object source, String address, String text) {
super(source);
this.address = address;
this.text = text;
}
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;
}
}
2,定义一个EmailNotifier类,实现ApplicationListener接口,并复写onApplicationEvent()方法
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
public class EmailNotifier implements ApplicationListener {
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof EmailEvent) {
EmailEvent emailEvent = (EmailEvent) event;
System.out.println("发送邮件的接收地址" + emailEvent.getAddress());
System.out.println("发送邮件的内容" + emailEvent.getText());
} else {
System.out.println("容器内部事件" + event);
}
}
}
3.将监听器配置在Spring容器中(即Spring配置文件中)—-(这里需要注意容器中所配置的监听器的类路径,你的应该和我的不同。不要盲目复制)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<bean class="com.book.spring.EmailNotifier"/>
</beans>
4.编写主程序main
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringText {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("/bean.xml");
EmailEvent ele = new EmailEvent("test", "spring_test@163.com", "this is a test");
ctx.publishEvent(ele);
}
}
程序到此结束,运行结果如下:
容器本身的事件:
org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@b81eda8: startup date [Thu Dec 04 20:20:52 CST 2014]; root of context hierarchy]
发送邮件的接收地址spring_test@163.com
发送邮件的内容this is a test