Spring事件机制的使用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_36279318/article/details/100976934

(一)、事件发布

1.启动SpringBoot项目

@SpringBootApplication
public class SpringEventApplication {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(SpringEventApplication.class, args);
        OrderPo orderPo = new OrderPo();
        orderPo.setId(1);
        orderPo.setOrderId("1234");
        orderPo.setPayOrderId("p1234");
        ApplicationContextUtil.publishEvent(new PublisEvent(orderPo));
    }
}

2.创建工具类 

@Component
class ApplicationContextUtil implements ApplicationContextAware {
    private static final Logger logger = LoggerFactory.getLogger(ApplicationContextUtil.class);
    private static ApplicationContext APPLICATION_CONTEXT;
    /**
     * 设置spring上下文
     * @param applicationContext spring上下文
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        logger.debug("ApplicationContext registed-->{}", applicationContext);
        APPLICATION_CONTEXT = applicationContext;
    }
    public static ApplicationContext getApplicationContext() { return APPLICATION_CONTEXT;  }
    /**
     * 发布事件,基于JVM内部的事件通知。必须运行在Spring环境中。
     * @param event
     */
    public static void publishEvent(ApplicationEvent event) throws Exception {
        if(event==null){
            logger.error("Spring发布事件失败,入参为null");
            return;
        }
        try{
            getApplicationContext().publishEvent(event);
            logger.info("Spring发布事件成功");
        }catch(Exception e){
            logger.error("Spring发布事件失败" + event, e);
            throw new Exception("Spring发布事件失败" + event);
        }
    }
}
/**
 * 当前Spring的上下文工具类,包含一些常用的工具方法,必须运行在Spring环境中
 */
public class SpringContextUtil  {

    private static final Logger logger = LoggerFactory.getLogger(SpringContextUtil.class);

    private static ApplicationContext applicationContext;

    /**必须运行在Spring环境中*/
    public static Object getBean(Class clazz){
        return ContextLoader.getCurrentWebApplicationContext().getBean(clazz);
    }

    /**必须运行在Spring环境中*/
    public static Object getBean(String beanName){
        return getApplicationContext().getBean(beanName);
    }

    public static void setApplicationContext(ApplicationContext applicationContext){
        if (SpringContextUtil.applicationContext == null){
            SpringContextUtil.applicationContext = applicationContext;
        }
    }

    public static ApplicationContext getApplicationContext(){
        return SpringContextUtil.applicationContext;
    }

    /**
     * 发布事件,基于JVM内部的事件通知。必须运行在Spring环境中。
     * @param event
     */
    public static void publishEvent(ApplicationEvent event) throws Exception {
        if(event==null){
            logger.error("Spring发布事件失败,入参为null");
            return;
        }
        try{
            getApplicationContext().publishEvent(event);
            logger.info("Spring发布事件成功");
        }catch(Exception e){
            logger.error("Spring发布事件失败" + event, e);
            throw new Exception("Spring发布事件失败" + event);
        }
    }

}

3.创建PO 

public class OrderPo {
    private int id;
    private String orderId;
    private String payOrderId;
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getOrderId() {
        return orderId;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

    public String getPayOrderId() {
        return payOrderId;
    }

    public void setPayOrderId(String payOrderId) {
        this.payOrderId = payOrderId;
    }

    @Override
    public String toString() {
        return "OrderPo{" +
                "id=" + id +
                ", orderId='" + orderId + '\'' +
                ", payOrderId='" + payOrderId + '\'' +
                '}';
    }
}

4.创建发布事件类 

public class PublisEvent extends ApplicationEvent {

	private static final long serialVersionUID = 2256159793354152460L;

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

}

5.创建事件接收类

@Component
public class ListenerPublisEvent implements SmartApplicationListener {
    private Logger logger = LoggerFactory.getLogger(getClass());
    @Override
    public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
        return eventType == PublisEvent.class;
    }

    @Override
    public boolean supportsSourceType(Class<?> sourceType) {
        return sourceType == OrderPo.class;
    }
    //监听处理对象
    @Override
    public int getOrder() {
        return 0;
    }

    @Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {
        if (applicationEvent == null || applicationEvent.getSource() == null) {
            logger.info("[推送xx消息事件]====参数为空,取消本次处理.");
            return;
        }
        //执行业务逻辑
        System.out.println("接收推送的消息事件");
        OrderPo orderPo = (OrderPo) applicationEvent.getSource();
        System.out.println(orderPo);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_36279318/article/details/100976934
今日推荐