spring 订阅发布实现

spring 进行订阅发布时,需要几个要素

  1. 事件类型 : 继承ApplicationEvent
  2. 事件信息 :  需要传递的参数对象
  3. 发布信息 : 发布事件
  4. 处理信息 : 处理事件

下面进行详细说明:

事件类型:必须继承ApplicationEvent类,实现构造器

import org.springframework.context.ApplicationEvent;

/**
 * 定义事件类型,必须继承ApplicationEvent
 */
public class QuoteEvent extends ApplicationEvent{

    public QuoteEvent(Object source) {
        super(source);
    }
}

 事件信息:事件发生时 需要发送的消息,普通bean

public class QuoteSource {
    private Quote quote;

    public Quote getQuote() {
        return quote;
    }

    public void setQuote(Quote quote) {
        this.quote = quote;
    }

    @Override
    public String toString() {
        return "QuoteSource{" +
                "quote=" + quote +
                '}';
    }
}

 事件发送:可以简单的使用 ApplicationContext 进行

SpringContextHolder.getApplicationContext().publishEvent(new QuoteEvent(quoteSource));

 SpringContextHolder 为工具类,保存了ApplicationContext,方便获取,代码如下:

 需要把此类注入spring容器中

import java.util.Map;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class SpringContextHolder implements ApplicationContextAware {
    private static ApplicationContext applicationContext = null;

    public SpringContextHolder() {
    }

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        checkApplicationContext();
        return applicationContext;
    }

    public static <T> T getBean(String name) {
        checkApplicationContext();
        return applicationContext.getBean(name);
    }

    public static <T> T getBean(Class<T> requiredType) {
        checkApplicationContext();
        return applicationContext.getBean(requiredType);
    }

    public static <T> Map<String, T> getBeans(Class<T> requiredType) {
        return applicationContext.getBeansOfType(requiredType);
    }

    public static void cleanApplicationContext() {
        applicationContext = null;
    }

    private static void checkApplicationContext() {
        if(applicationContext == null) {
            throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder");
        }
    }

 处理消息:接受 处理消息,代码比较简单 就不解释了

import org.springframework.context.ApplicationEvent;
import org.springframework.context.event.SmartApplicationListener;

/**
 *
 * 事件订阅类,监听发生的事件
 * Created by xuebj on 2016/3/15.
 */
public class QuoteListener implements SmartApplicationListener {
    /**
     * 支持的事件类型
     * @param eventType
     * @return
     */
    @Override
    public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
        return QuoteEvent.class.isAssignableFrom(eventType);
    }

    /**
     * 支持的对象类型
     * @param   sourceType
     * @return
     */
    @Override
    public boolean supportsSourceType(Class<?> sourceType) {
        return QuoteSource.class.isAssignableFrom(sourceType);
    }

    /**
     * 事件发生时此方法被触发
     * @param applicationEvent
     */
    @Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {
        //获取事件的参数对象
        Quote quote = (Quote) applicationEvent.getSource();
        //业务处理
    }

    /**
     * 定义执行顺序
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}

猜你喜欢

转载自butteryrose.iteye.com/blog/2283056