Spring源码解读:EventListener接口

来源:互联网 发布:网络棋牌室平台代理 编辑:程序博客网 时间:2024/05/21 19:27

在Spring中有这样一种情景就是,我只想监听我想要的那个事件其他的我不需要。OK,在Spring中确实可以实现这种需求,先看看怎样监听的

package com.yohanliyanage.blog.springevents;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.context.ApplicationEvent;import org.springframework.context.ApplicationListener;public class MyEventListener implements ApplicationListener {    private static final Log LOG = LogFactory.getLog(MyEventListener.class);    public void onApplicationEvent(ApplicationEvent event) {        LOG.info("Event Occurred : " + event);    }}

< ?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"><!-- Adding the listener class to Spring Container automatically registers it for events --><bean class="com.yohanliyanage.blog.springevents.MyEventListener" /></beans>

好了这样的话

public class Main {    public static void main(String[] args) throws InterruptedException {        ApplicationContext context =            new ClassPathXmlApplicationContext("classpath:META-INF/spring/application-context.xml");    }}

18:45:00 INFO Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7a982589: startup date [Sun Sep 30 18:45:00 IST 2012]; root of context hierarchy18:45:00 INFO Loading XML bean definitions from class path resource [META-INF/spring/application-context.xml]18:45:00 INFO Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@33e228bc: defining beans [com.yohanliyanage.blog.springevents.MyEventListener#0]; root of factory hierarchy18:45:00 INFO Event Occurred : org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@7a982589: startup date [Sun Sep 30 18:45:00 IST 2012]; root of context hierarchy]

怎样实现自己的Event的呢?

package com.yohanliyanage.blog.springevents;import org.springframework.context.ApplicationEvent;public class MyCustomEvent extends ApplicationEvent {private static final long serialVersionUID = -5308299518665062983L;public MyCustomEvent(Object source) {super(source);}}

那怎样发布事件呢?

package com.yohanliyanage.blog.springevents;import org.springframework.context.ApplicationEventPublisher;import org.springframework.context.ApplicationEventPublisherAware;public class MyEventPublisher implements ApplicationEventPublisherAware {private ApplicationEventPublisher publisher;public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {this.publisher = publisher;}public void publish() {this.publisher.publishEvent(new MyCustomEvent(this));}}

<bean class="com.yohanliyanage.blog.springevents.MyEventPublisher" />
public static void main(String[] args) throws InterruptedException {ApplicationContext context = new ClassPathXmlApplicationContext("classpath:META-INF/spring/application-context.xml");MyEventPublisher publisher = context.getBean(MyEventPublisher.class);publisher.publish();}

那么还按上面ApplicationEventListener的话输出是这样的

19:21:18 INFO Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7a982589: startup date [Sun Sep 30 19:21:18 IST 2012]; root of context hierarchy19:21:18 INFO Loading XML bean definitions from class path resource [META-INF/spring/application-context.xml]19:21:19 INFO Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@2565a3c2: defining beans [com.yohanliyanage.blog.springevents.MyEventListener#0,com.yohanliyanage.blog.springevents.MyEventPublisher#0]; root of factory hierarchy19:21:19 INFO Event Occurred : org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.support.ClassPathXmlApplicationContext@7a982589: startup date [Sun Sep 30 19:21:18 IST 2012]; root of context hierarchy]19:21:19 INFO Event Occurred : com.yohanliyanage.blog.springevents.MyCustomEvent[source=com.yohanliyanage.blog.springevents.MyEventPublisher@5a676437]

现在只想监听我自己定制的ApplicationEvent,,3.0以后

package com.yohanliyanage.blog.springevents;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.context.ApplicationListener;public class MyEventListener implements ApplicationListener < MyCustomEvent > {private static final Log LOG = LogFactory.getLog(MyEventListener.class);public void onApplicationEvent(MyCustomEvent event) {LOG.info("Event Occurred : " + event);}}
打印如下

19:29:31 INFO Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7a982589: startup date [Sun Sep 30 19:29:31 IST 2012]; root of context hierarchy19:29:31 INFO Loading XML bean definitions from class path resource [META-INF/spring/application-context.xml]19:29:31 INFO Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@2565a3c2: defining beans [com.yohanliyanage.blog.springevents.MyEventListener#0,com.yohanliyanage.blog.springevents.MyEventPublisher#0]; root of factory hierarchy19:29:31 INFO Event Occurred : com.yohanliyanage.blog.springevents.MyCustomEvent[source=com.yohanliyanage.blog.springevents.MyEventPublisher@5a676437]

上面说的都是同步的操作,还有异步的 ApplicationEventMulticaster可以用于TaskExecutor

在spring中EventListener接口的源码

package java.util;/** * A tagging interface that all event listener interfaces must extend. * @since JDK1.1 */public interface EventListener {}

EventListener 解释说明了EventListener只是一个标记接口和Cloneable,Serializable没是什么区别,只是用来标记一下事件监听器的接口。


0 0