zoukankan      html  css  js  c++  java
  • [案例一] 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/案例一

  • 相关阅读:
    十分钟了解HTTPS协议
    浅谈程序员的学历
    浅谈前后模板引擎的利与弊
    简单理解预加载技术
    简单理解懒加载技术
    C#.NET里面抽象类和接口有什么区别
    Select count(*)、Count(1)、Count(0)的区别和执行效率比较
    c#中decimal ,double,float的区别
    C#使用log4net记录日志
    SQLServer无法打开用户默认数据库 登录失败错误4064的解决方法
  • 原文地址:https://www.cnblogs.com/moris5013/p/11119901.html
Copyright © 2011-2022 走看看