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

posted @ 2019-07-02 12:44  踏月而来  阅读(1202)  评论(0编辑  收藏  举报