「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!」
定义:
观察者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个“观察” 该对象的其他对象。
实践需求:
消费者在系统留言后,需要系统站内信息通知下系统管理员、也需要用邮件通知下管理员
代码:
留言实体类:CustomerLeaveMessage.java
public class CustomerLeaveMessage implements Serializable {
private static final long serialVersionUID = 1L;
private String id; // 主键
private String name; // 联系人
private String phone; // 联系电话
private String email; // 联系邮箱
private String content; // 留言内容
}
新建个Event,继承ApplicationEvent,里面传递个CustomerLeaveMessage参数,用于业务逻辑:
/**
* @author 勤任风
* 消费者 留言事件
* @date 2021-07-16 14:26
*/
public class CustomerLeaveMessageEvent extends ApplicationEvent {
public CustomerLeaveMessageEvent(CustomerLeaveMessage source) {
super(source);
}
}
此时,有两种方法来实现监听,一种是实现ApplicationListener接口,另一种是使用@EventListener实现注解
-
实现ApplicationListener接口
/**
* 监听CustomerLeaveMessageEvent 事件后的逻辑
* @author 勤任风
* @date 2021-07-16 14:30
*/
@Slf4j
@Service
public class CustomerLeaveMessageEventService implements ApplicationListener<CustomerLeaveMessageEvent> {
/**
* 执行监听后的逻辑
* @param customerLeaveMessageEvent
*/
@Override
@Async //异步
public void onApplicationEvent(CustomerLeaveMessageEvent customerLeaveMessageEvent) {
log.info(
"用户留言后的逻辑响应,发送站内通知给管理员:{}",customerLeaveMessageEvent.toString()
);
}
}
-
通过注解@EventListener实现。
@Service
@Slf4j
public class CustomerLeaveMessageEventListener {
@EventListener
public void sendEmail(CustomerLeaveMessageEvent event){
log.info("发送邮件给管理员");
}
}
最终在service使用:
(1)注入ApplicationContext
@Autowired
private ApplicationContext applicationContext;
(2)然后在客户留言后面的逻辑追加该语句
applicationContext.publishEvent(new CustomerLeaveMessageEvent(customerLeaveMessage));