事件驱动模型是观察者模式的另一种形态,观察者相当于监听器,被观察者相当于事件源
事件源产生事件,监听器监听事件
以用户注册时候,要发送邮件和发送短信举例说明
定义一个事件
/** * 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/案例一