• [案例一] 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/案例一

  • 相关阅读:
    watir简单使用
    一些简单的Linux网络配置命令
    Watir识别HTML元素的方法及watir api补充
    web系统测试
    测试方法
    内存泄漏检测工具
    跟我一起学Oracle 11g【10】Oracle 中的那些函数
    限制textarea 文本框的长度(收集了几个办法)
    跟我一起学Oracle 11g【9】SQL 基础学习[嵌套查询]
    通过程序启用/禁用 网络连接(提供4种思路 你值得拥有)
  • 原文地址:https://www.cnblogs.com/moris5013/p/11119901.html
Copyright © 2020-2023  润新知