观察者模式
观察者模式是一种对象行为型模式。它表示的是一种对象与对象之间具有依赖关系,当一个对象发生改变的时候,这个对象所依赖的对象也会做出反应。Spring 事件驱动模型就是观察者模式很经典的一个应用。Spring 事件驱动模型非常有用,在很多场景都可以解耦我们的代码。比如我们每次添加商品的时候都需要重新更新商品索引,这个时候就可以利用观察者模式来解决这个问题。
事件驱动三种角色
1、事件角色ApplicationEvent
充当事件的角色,这是一个抽象类,它继承了java.util.EventObject并实现了 java.io.Serializable接口。
Spring 中默认存在以下事件,他们都是对 ApplicationContextEvent 的实现(继承自ApplicationContextEvent):
2、事件监听者角色ApplicationListener
充当了事件监听者角色,它是一个接口,里面只定义了一个 onApplicationEvent()方法来处理ApplicationEvent。ApplicationListener接口类源码如下,可以看出接口定义看出接口中的事件只要实现了 ApplicationEvent就可以了。所以,在 Spring中我们只要实现 ApplicationListener 接口实现 onApplicationEvent() 方法即可完成监听事件
3、事件发布者角色ApplicationEventPublisher
他是事件发布者
流程总结
1、定义一个事件:事件继承ApplicationEvent类,并实现其构造函数。
2、定义一个事件发布者:通过ApplicationEventPublisher.publishEvent方法
3、定义一个事件监听者:实现ApplicationListener接口,重写onApplicationEvent方法。
下面展示一些 内联代码片
。
// User事件
public class UserEvent extends ApplicationEvent {
String message;
public UserEvent(Object source, String message) {
super(source);
this.message = message;
}
public String getMessage() {
return message;
}
}
//事件发布者
@Component
public class UserPublisher {
@Autowired
ApplicationContext applicationContext;
public void publish(String message){
applicationContext.publishEvent(new UserEvent(this,message));
}
}
//事件监听者
@Component
public class UserListener implements ApplicationListener<UserEvent> {
@Override
public void onApplicationEvent(UserEvent userEvent) {
String message = userEvent.getMessage();
System.out.println("listener user message:"+message);
}
}
//demo
@RequestMapping
public class DemoRest {
@Autowired
UserPublisher userPublisher;
@RequestMapping("/event")
public Object event(@RequestParam(required = false)String message){
log.info("start event message:"+message);
userPublisher.publish(message);
return "ok";
}
}
启动程序,用postman调用下接口