您的位置:首页 > 编程语言 > Java开发

Spring:Aware和事件

2015-12-08 16:03 477 查看
一、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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: