美文网首页
使用ApplicationEvent和Listener实现业务解

使用ApplicationEvent和Listener实现业务解

作者: gmdqtd | 来源:发表于2019-08-15 23:07 被阅读0次

    ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式,设计初衷也是为了系统业务逻辑之间的解耦,提高可扩展性以及可维护性。
    通过 ApplicationEvent 类和 ApplicationListener 接口来提供在 ApplicationContext 中处理事件。如果一个 bean 实现 ApplicationListener,那么每次 ApplicationEvent 被发布到 ApplicationContext 上,那个 bean 会被通知。

    Spring 提供了以下的标准事件:

    序号 Spring 内置事件 & 描述
    1 ContextRefreshedEvent ApplicationContext 被初始化或刷新时,该事件被发布。这也可以在 ConfigurableApplicationContext 接口中使用 refresh() 方法来发生。
    2 ContextStartedEvent当使用 ConfigurableApplicationContext 接口中的 start() 方法启动 ApplicationContext 时,该事件被发布。你可以调查你的数据库,或者你可以在接受到这个事件后重启任何停止的应用程序。
    3 ContextStoppedEvent当使用 ConfigurableApplicationContext 接口中的 stop() 方法停止 ApplicationContext 时,发布这个事件。你可以在接受到这个事件后做必要的清理的工作。
    4 ContextClosedEvent当使用 ConfigurableApplicationContext 接口中的 close() 方法关闭 ApplicationContext 时,该事件被发布。一个已关闭的上下文到达生命周期末端;它不能被刷新或重启。
    5 RequestHandledEvent这是一个 web-specific 事件,告诉所有 bean HTTP 请求已经被服务。
    demo

    1、创建Event事件

    import com.br.bean.User;
    import org.springframework.context.ApplicationEvent;
    
    /**
     * @author
     */
    public class UserRegisterEvent extends ApplicationEvent {
        public User user;
        /**
         *
         * @param source 发生事件的对象
         * @param user 注册用户对象
         */
        public UserRegisterEvent(Object source,User user) {
            super(source);
            this.user = user;
        }
        public User getUser() {
            return user;
        }
        public void setUser(User user) {
            this.user = user;
        }
    }
    

    2、事件发布
    此部分主要在业务逻辑模块触发,主要用到ApplicationContext类以及它的publishEvent(ApplicationEvent t)方法。

    import com.br.bean.User;
    import com.br.event.UserRegisterEvent;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.ApplicationContext;
    import org.springframework.stereotype.Service;
    
    /**
     * @author jackcooper
     * @create 2018-02-27 14:03
     */
    @Service
    public class UserService {
    
        @Autowired
        private ApplicationContext applicationContext;
    
        public void register(User user){
            //省略业务逻辑
            //。。。。
            //发布UserRegisterEvent事件
            applicationContext.publishEvent(new UserRegisterEvent(this,user));
        }
    }
    

    3、创建Event事件监听

    通过实现 ApplicationListener接口

    import com.br.bean.User;
    import com.br.event.UserRegisterEvent;
    import org.springframework.context.ApplicationListener;
    import org.springframework.stereotype.Component;
    
    /**
     * @deprecated ApplicationListener实现监听:这种方式也是Spring之前比较常用的监听事件方式,在实现ApplicationListener接口时需要将监听事件作为泛型传递,监听实现代码如下所示
     */
    @Component
    public class RegisterListener implements ApplicationListener<UserRegisterEvent> {
    
        /**
         * 实现监听
         * @param userRegisterEvent
         */
        @Override
        public void onApplicationEvent(UserRegisterEvent userRegisterEvent) {
            //获取注册用户对象
            User user = userRegisterEvent.getUser();
    
            //../省略逻辑
    
            //输出注册用户信息
            System.out.println("2注册信息,用户名:"+user.getName()+",密码:"+user.getEmail());
        }
    }
    

    文章参考https://www.jianshu.com/p/4359dd4b36a6

    相关文章

      网友评论

          本文标题:使用ApplicationEvent和Listener实现业务解

          本文链接:https://www.haomeiwen.com/subject/iifxsctx.html