• [案例一] Spring中的事件驱动模型(机制)


    事件驱动模型是观察者模式的另一种形态,观察者相当于监听器,被观察者相当于事件源

    事件源产生事件,监听器监听事件

     

    以用户注册时候,要发送邮件和发送短信举例说明

    定义一个事件

    /**
     * spring会自动将该事件注册到applicationContext中
     * 这里有通过构造方法将事件源传递进去,有些场景可以用到,本例子中的事件源是UserService
     */
    public class UserRegisterEvent extends ApplicationEvent
    {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        //注册用户对象
        private UserBean user;
    
        /**
         * 重写构造函数
         * @param source 发生事件的对象
         * @param user 注册用户对象
         */
        public UserRegisterEvent(Object source,UserBean user) {
            super(source);
            this.user = user;
        }
    
        public UserBean getUser() {
            return user;
        }
        
        
    }

    定义事件监听

    @Component
    public class RegisterListener implements ApplicationListener<UserRegisterEvent>
    {
        /**
         * 实现监听
         * @param userRegisterEvent
         */
        @Override
        @Async
        public void onApplicationEvent(UserRegisterEvent userRegisterEvent) {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //获取注册用户对象
            UserBean user = userRegisterEvent.getUser();
            //../省略逻辑
            //输出注册用户信息
            System.out.println("注册信息,用户名:"+user.getName()+",密码:"+user.getPassword());
        }
    }

     发布事件

    @Service
    public class UserService
    {
        @Autowired
        ApplicationContext applicationContext;
    
        /**
         * 用户注册方法
         * @param user
         */
        public void register(UserBean user)
        {
            //../省略其他逻辑
            //发布UserRegisterEvent事件
            applicationContext.publishEvent(new UserRegisterEvent(this,user));
        }
    }

    项目结构

    有序监听

    使用SmartApplicationListener实现有序监听

    异步监听

    使用@Async实现异步监听

    项目地址:https://github.com/jake1263/spring/tree/master/案例一

  • 相关阅读:
    Python (time、datetime、random、os、sys、shutil)模块的使用
    ELK6+filebeat、kafka、zookeeper搭建文档
    JDBC-用Java语句操作数据库
    数据库对象
    sql之子查询
    函数之sql语句
    sql之select语句
    oracle 数据库
    网络编程
    多线程——多线程的运行轨迹,线程的生命周期,线程的常用方法,线程的安全问题,死锁,线程间的通信
  • 原文地址:https://www.cnblogs.com/moris5013/p/11119901.html
Copyright © 2020-2023  润新知