zoukankan      html  css  js  c++  java
  • 【sping揭秘】9、容器内部事件发布(二)

    写在前面----------------------------------

    命运多舛,痴迷淡然

    不知下一步该往哪里走,现在应该是我的迷茫期。。。

    加油,快点走出去!!!

    聪明的网友们,你们有没有迷茫的时候,你们又是怎么度过的呢?

    通过上面的笔记我们可以了解到spring的事件的监听,但是这个都是spring中定义好的,那么我们如何自定义事件,监听,以及发布呢?、

    那么事件的创建,我们是实现spring的事件接口

    Spring的事件对象

    package cn.cutter.start.event;
    
    import org.springframework.context.ApplicationEvent;
    
    import cn.cutter.start.event.constant.MethodExecutionStatusEnum;
    
    /**
     * 
     * Title: MethodExecutionEvent.java
     * Description: 定义一个自定义的spring事件对象
     * @author xiaof
     * @date 2018年3月28日
     * @version 1.0 
     *
     */
    public class MethodExecutionEvent extends ApplicationEvent {
        
        /**
         * 
         */
        private static final long serialVersionUID = 2211772210416245698L;
        
        private String methodName;
        private MethodExecutionStatusEnum methodExecutionStatusEnum;
    
        /**
         * 构造函数是,继承的类实现的
         * @param source
         */
        public MethodExecutionEvent(Object source) {
            super(source);
        }
    
        public MethodExecutionEvent(Object source, String methodName, MethodExecutionStatusEnum methodExecutionStatusEnum) {
            super(source);
            this.methodName = methodName;
            this.methodExecutionStatusEnum = methodExecutionStatusEnum;
        }
    
        public String getMethodName() {
            return methodName;
        }
    
        public void setMethodName(String methodName) {
            this.methodName = methodName;
        }
    
        public MethodExecutionStatusEnum getMethodExecutionStatusEnum() {
            return methodExecutionStatusEnum;
        }
    
        public void setMethodExecutionStatusEnum(MethodExecutionStatusEnum methodExecutionStatusEnum) {
            this.methodExecutionStatusEnum = methodExecutionStatusEnum;
        }
        
    }

    事件的监听

    package cn.cutter.start.event;
    
    import org.springframework.context.ApplicationEvent;
    import org.springframework.context.ApplicationListener;
    import org.springframework.stereotype.Component;
    
    import cn.cutter.start.event.constant.MethodExecutionStatusEnum;
    
    /**
     * 
     * Title: MethodExecutionEventListener.java
     * Description: spring事件监听类型
     * @author xiaof
     * @date 2018年4月1日
     * @version 1.0 
     *
     */
    @Component  //一定要添加进入spring的容器,才能进行监听
    public class MethodExecutionEventListener implements ApplicationListener {
    
        @Override
        public void onApplicationEvent(ApplicationEvent event) {
            if(event instanceof MethodExecutionEvent) {
                
                MethodExecutionEvent methodExecutionEvent = (MethodExecutionEvent) event;
                
                //执行处理逻辑
                System.out.println("执行自定义事件的相应操作");
                
                if(methodExecutionEvent.getMethodExecutionStatusEnum().equals(MethodExecutionStatusEnum.BEGIN)) {
                    //方法开始方式
                    System.out.println("begin 开始执行前置事件----" + methodExecutionEvent.getMethodName());
                } else {
                    System.out.println("end  开始执行后置事件----" + methodExecutionEvent.getMethodName());
                }
                
                
                
            }
        }
    
    }

    事件的发布对象

    package cn.cutter.start.event;
    
    import org.springframework.context.ApplicationEventPublisher;
    import org.springframework.context.ApplicationEventPublisherAware;
    import org.springframework.stereotype.Component;
    
    import cn.cutter.start.event.constant.MethodExecutionStatusEnum;
    
    /**
     * 
     * Title: MethodExeuctionEventPublisher.java
     * Description: 这里实现ApplicationEventPublisherAware,方便对applicationEventPublisher的注入
     * @author xiaof
     * @date 2018年4月1日
     * @version 1.0 
     *
     */
    @Component
    public class MethodExeuctionEventPublisher implements ApplicationEventPublisherAware {
        
        private ApplicationEventPublisher applicationEventPublisher;
    
        @Override
        public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
            this.applicationEventPublisher = applicationEventPublisher;
        }
        
        public void methodToMonitor() {
            //这个方法就是对事件的发布操作
            //发起开始事件并发布,发起后置事件并结束
            MethodExecutionEvent beginEvnt = new MethodExecutionEvent(this, "cn.cutter.start.event methodToMonitor方法触发事件", MethodExecutionStatusEnum.BEGIN);
            
            MethodExecutionEvent endEvnt = new MethodExecutionEvent(this, "cn.cutter.start.event methodToMonitor方法触发事件", MethodExecutionStatusEnum.END);
            
            //发布
            this.applicationEventPublisher.publishEvent(beginEvnt);
            
            //
            System.out.println("进行 methodToMonitor 业务方法本体");
            
            //发布
            this.applicationEventPublisher.publishEvent(endEvnt);
            
        }
    
    }

    测试方式:

    @Test
        public void testSpringEvent() {
        
            ApplicationContext ctx = this.before();
            
            cn.cutter.start.event.MethodExeuctionEventPublisher methodExeuctionEventPublisher = (cn.cutter.start.event.MethodExeuctionEventPublisher) ctx.getBean("methodExeuctionEventPublisher");
            
            methodExeuctionEventPublisher.methodToMonitor();
            
        }

    操作结果:

  • 相关阅读:
    国科大 高级人工智能 期末复习总结
    算法岗面试问题总结
    java如何判断溢出
    matrix67中适合程序员的例子
    java map
    tensorflow手写数字识别(有注释)
    epoch,iteration与batchsize的区别
    java中如何不自己写排序方法完成排序
    Kotlin实现《第一行代码》案例“酷欧天气”
    Kotlin入门第三课:数据类型
  • 原文地址:https://www.cnblogs.com/cutter-point/p/8886193.html
Copyright © 2011-2022 走看看