ApplicationContext的事件处理
晓峰来到Spring世界已经很多年了。自从他掌握了现在Spring政府两位当权者的全部家庭资料以后(BeanFactory和ApplicationContext)。活的那叫一个滋润。
晓峰心里那个美就别提了,想干什么没有干不成的,绝对有和绅第二的觉悟。但是晓峰也是深得中华五千年的文化熏陶。万事自己少出头,出头也要找个枪先扔出去试试在说。现在他已经是Spring上上下下的不可或缺的万金油了。人缘特棒
晓峰对ApplicationContext进行了多年的跟踪了解,发现Spring国度看似管理的很松散其实是很严格,只要你一犯错立刻把你从Spring国清除出去。
ApplicationContext手下有两大特务机构。第一个是 ApplicationEvent 类、第二个是 ApplicationListener接口 。有着两个特务机关一起合作来帮助ApplicationContext管理这个国家。
晓峰通过多年的打探得到了他们的详细职能
ApplicationEvent :Spring政府事件,必须由ApplicationContext发布
ApplicationListener : 可由Spring政府中的任何监听器Bean担任。
ApplicationEvent的详细信息
package org.springframework.context;
import java.util.EventObject;
public abstract class ApplicationEvent extends EventObject {
private static final long serialVersionUID = 7099057708183571937L;
private final long timestamp;
public ApplicationEvent(Object source) {//构造器
super(source);
this.timestamp = System.currentTimeMillis();
}
public final long getTimestamp() {//得到时间毫秒数
return this.timestamp;
}
}
ApplicationListeren 的详细信息
package org.springframework.context;
import java.util.EventListener;
public interface ApplicationListener extends EventListener {
void onApplicationEvent(ApplicationEvent event);
}
ApplicationListeren、ApplictionEven和ApplicationContext构成了一个观察者模式
通俗的说就是:ApplicationListeren一直监视着你。只要你一做事情ApplictionEven就会根据你做的事情作出其相应的反应
下面我们拿求婚这件浪漫的事说话他们是怎么工作的吧
ApplicationEvent 派遣了一个事件响应人员 SayLove
SayLove的详细内容
package Event;
import org.springframework.context.ApplicationEvent;
public class SayLove extends ApplicationEvent{
public String count ;
public SayLove(Object source) {
super (source);
}
private static final long serialVersionUID = 1L;
public SayLove(Object source,String count){
super (source);
this . count = count ;
}
public String getCount() {
return count ;
}
public void setCount(String count) {
this . count = count;
}
}
事件必须是任职于ApplicationEvent的Bean(一定要继承ApplicationEvent)
ApplicationListeren派遣的监视人员是 SayLoveListeren
SayLoveListeren 的详细信息如下:
package Event;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
public class SayLoveListeren implements ApplicationListener{
public void onApplicationEvent(ApplicationEvent arg0) {
if (arg0 instanceof SayLove){
SayLove sl =(SayLove)arg0;
System. out .println( "Spring政府机关秘密记录了" );
System. out .println(sl.getCount()+ "开始求婚宣言了!!" );
} else {
System. out .println( "Spring政府事件" );
}
}
}
派遣的监视人员必须是供职于ApplicationListeren的职员。这些职员必须掌握的技能是 public void onApplicationEvent(ApplicationEvent arg0) { }
事件和监听的文件是:
<? 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-2.0.xsd" >
<!-- 设置监听器 -->
< bean id = "sayLoveListeren" class = "Event.SayLoveListeren" />
</ beans >
测试平台
package Event;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Text {
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext( "applicationContext.xml" );
SayLove sl = new SayLove( "shuo" , "孩子他妈,孩子都2岁了,嫁给我吧!!" );
ctx.publishEvent(sl);
}
}
结果是:
Spring政府事件
Spring政府机关秘密记录了
孩子他妈,孩子都2岁了,嫁给我吧!!开始求婚宣言了!!
Spring政府还有几个事件处理部门
1. ContextRefreshedEven ApplicationContext容器初试化或刷新时,触发该事件
2. ContextClostEvent ApplicationContext容器关闭时,触发该时间
3. RequestHandledEvent web相关的时间,只能应用于使用DispatcherServlet的web应用