Spring中的Aware和事件
2015-11-30 10:54
447 查看
一、Aware相关接口
1,Spring中提供一些Aware相关接口,像是BeanNameAware、ApplicationContextAware、ResourceLoaderAware、ServletContextAware等等,实现这些 Aware接口的Bean在被初始之后,可以取得一些相对应的资源,例如实作BeanFactoryAware的Bean在初始后,Spring容器将会注入BeanFactory的实例,而实作ApplicationContextAware的Bean,在Bean被初始后,将会被注入
ApplicationContext的实例等等。
2,对于 ServletContextAware,只有在Web容器中运行时才有值。
二、事件(Spring Reference Documentation 3.8.3. Events)
1,Spring的ApplicationContext会自动在当前的所有Bean中寻找ApplicationListener接口的实现,并将其作为事件接收对象。当ApplicationContext.publishEvent()方法调用时,所有定义的ApplicationListener接口的实现类都会被触发,每个ApplicationListener可根据事件的类型判断是否是自己需要处理的事件。观察者模式(Observer,此种模式通常被用来实作事件处理系统)。
2,主要用到的spring的类和接口有:
1,事件类:org.springframework.context.ApplicationEvent(抽象类),其子类来实现事件:
1,ContextRefreshedEvent
在ApplicationContext初始化或Refresh(调用refresh()方法)时发布事件
2,ContextClosedEvent
在ApplicationContext关闭(调用close()方法)时发布事件
3,ContextStartedEvent
在调用start()方法时发布事件
4,ContextStoppedEvent
在调用end()方法时发布事件
5,RequestHandledEvent
无
2,事件监听器:org.springframework.context.ApplicationListener (接口),其实现类实现事件的监听。
在ApplicationListener的实现类中可以只处理自己关心的事件,如:
public class MyListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ContextRefreshedEvent) {
System.out.println("ApplicationContext初始化或刷新了.");
}
}
}
3,发布事件:
ApplicationContext.publishEvent(ApplicationEvent event); // 会触发所有已定义的ApplicationListener实现类
3,测试:
public class SpringListenerTest {
@Test
public void test() {
// 要使用具体实现类,才有refresh()等方法
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
ac.publishEvent(new MyEvent(ac));
ac.refresh();
ac.close();
}
}
class MyEvent extends ApplicationEvent {
public MyEvent(Object source) {
super(source);
}
}
@Component
class MyListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
System.out.println("----> event = " + event);
}
}
1,Spring中提供一些Aware相关接口,像是BeanNameAware、ApplicationContextAware、ResourceLoaderAware、ServletContextAware等等,实现这些 Aware接口的Bean在被初始之后,可以取得一些相对应的资源,例如实作BeanFactoryAware的Bean在初始后,Spring容器将会注入BeanFactory的实例,而实作ApplicationContextAware的Bean,在Bean被初始后,将会被注入
ApplicationContext的实例等等。
2,对于 ServletContextAware,只有在Web容器中运行时才有值。
二、事件(Spring Reference Documentation 3.8.3. Events)
1,Spring的ApplicationContext会自动在当前的所有Bean中寻找ApplicationListener接口的实现,并将其作为事件接收对象。当ApplicationContext.publishEvent()方法调用时,所有定义的ApplicationListener接口的实现类都会被触发,每个ApplicationListener可根据事件的类型判断是否是自己需要处理的事件。观察者模式(Observer,此种模式通常被用来实作事件处理系统)。
2,主要用到的spring的类和接口有:
1,事件类:org.springframework.context.ApplicationEvent(抽象类),其子类来实现事件:
1,ContextRefreshedEvent
在ApplicationContext初始化或Refresh(调用refresh()方法)时发布事件
2,ContextClosedEvent
在ApplicationContext关闭(调用close()方法)时发布事件
3,ContextStartedEvent
在调用start()方法时发布事件
4,ContextStoppedEvent
在调用end()方法时发布事件
5,RequestHandledEvent
无
2,事件监听器:org.springframework.context.ApplicationListener (接口),其实现类实现事件的监听。
在ApplicationListener的实现类中可以只处理自己关心的事件,如:
public class MyListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ContextRefreshedEvent) {
System.out.println("ApplicationContext初始化或刷新了.");
}
}
}
3,发布事件:
ApplicationContext.publishEvent(ApplicationEvent event); // 会触发所有已定义的ApplicationListener实现类
3,测试:
public class SpringListenerTest {
@Test
public void test() {
// 要使用具体实现类,才有refresh()等方法
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
ac.publishEvent(new MyEvent(ac));
ac.refresh();
ac.close();
}
}
class MyEvent extends ApplicationEvent {
public MyEvent(Object source) {
super(source);
}
}
@Component
class MyListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
System.out.println("----> event = " + event);
}
}
相关文章推荐
- JAVA泛型那些事儿
- 3.聚类–K-means的Java实现
- java设计模式-适配器模式
- myeclipse Invalid Subscription level error
- [转]Java中怎样判断一个字符串能否转成数字
- JNI开发初学--javap,javah命令使用无法找到类问题
- java日期操作
- 【Java基础】开发中的23种设计模式详解
- Spring4.2.3+Hibernate4.3.11整合( IntelliJ maven项目)
- 【Java并发编程实战】-----“J.U.C”:Exchanger
- 《Java知识点列表》V1.0
- java 每日习题(十二) 题目:通过输入的第一个字母识别指定的几个单词
- 【Java并发编程实战】—–“J.U.C”:Phaser
- JAVA基础(13) javaMail发送邮件设置发件人中文昵称
- 【Java并发编程实战】—–“J.U.C”:CountDownlatch
- 【Java并发编程实战】—–“J.U.C”:CyclicBarrier
- eclipse project explorer 下面的字体怎么更改大小
- 【Java并发编程实战】—–“J.U.C”:ReentrantReadWriteLock
- JAVA基础(1)
- java 删除文件夹