免费资料网站网址下载,视频网站开发php,基础建设的意义,网站建设案例 优帮云spring 4.3.x创建松耦合应用程序的概念和技术很多#xff0c;Event是其中之一。 事件可以消除代码中的许多依赖关系。 有时没有事件#xff0c;很难实施SRP *。 Java中的Observable接口可以帮助我们实现事件#xff08;通过Observer Pattern#xff09;。 但是#xff0c… spring 4.3.x 创建松耦合应用程序的概念和技术很多Event是其中之一。 事件可以消除代码中的许多依赖关系。 有时没有事件很难实施SRP *。 Java中的Observable接口可以帮助我们实现事件通过Observer Pattern。 但是等等这篇文章的目标是关于Spring Event的快速教程。 Spring具有一些用于创建事件驱动应用程序的好工具。 您可以在一个bean中引发一个特定的事件并在另一个bean中监听它。 想象一个简单的应用程序具有以下要求 有些订单的状态可能不同 当订单处于“已交付”或“已推迟”状态时我们需要向客户发送电子邮件 满足需求的第一个但不是最好的解决方案是在我们的订单模型中发送电子邮件但是存在一些缺陷 订单不负责发送电子邮件。 如果您遵循域驱动原则那么Order是一个域对象但Email Sender可能是一项服务不同于Domain Service因此您不能在模型中使用它。 另一个解决方案是在更改其状态后在Order模型中引发一些事件。 我不关心订购在引发此事件之后会发生什么。 在我们的示例中我们需要收听特定类型的事件对其进行分析并开展一些业务发送电子邮件。 Configurablepublic class Order implements ApplicationEventPublisherAware {private final String orderId;private final Date createDate;private final CustomerInfo customerInfo;private ApplicationEventPublisher eventPublisher;private Date lastUpdateDate;private Status status;public Order(String orderId, CustomerInfo customerInfo) {this.orderId orderId;this.customerInfo customerInfo;status Status.MODIFIABLE;this.createDate new Date();this.lastUpdateDate this.createDate;}public String getOrderId() {return orderId;}public void checkOut() {if (status Status.DELIVERED) {throw new IllegalStateException(String.format(Order is already delivered));}this.status Status.CHECKED_OUT;this.lastUpdateDate new Date();}public void deliver() {if (this.status ! Status.CHECKED_OUT this.status ! Status.POSTPONED) {throw new IllegalStateException(String.format(Order status should be CHECKED OUT for delivery to be called. but is : %s, status));}this.status Status.DELIVERED;this.lastUpdateDate new Date();this.eventPublisher.publishEvent(new OnOrderDelivered(this));}public void postponeDelivery() {if (status ! Status.CHECKED_OUT status ! Status.POSTPONED) {throw new IllegalStateException(String.format(Can not postpone delivery in this state: %s, status));}this.status Status.POSTPONED;this.lastUpdateDate new Date();this.eventPublisher.publishEvent(new OnOrderPostponed(this));}public Status getStatus() {return status;}public CustomerInfo getCustomerInfo() {return customerInfo;}public Date getLastUpdateDate() {return lastUpdateDate;}public Date getCreateDate() {return createDate;}Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.eventPublisher applicationEventPublisher;}public static enum Status {MODIFIABLE,CHECKED_OUT,POSTPONED,DELIVERED,CANCELED;}} 如您所见Order是一个可配置的类如果您以前从未使用过此概念请不要为之苦恼。 对于这篇文章您只需要知道可配置类可以在任何地方使用new关键字创建但是它们是由spring管理的因此您可以向其中注入其他bean或将大多数spring功能与它们一起使用。 我保证会尽快发布有关它的文章。 Order类实现org.springframework.context.ApplicationEventPublisherAware接口。 此接口具有名称为setApplicationEventPublisher的setter方法该方法表示要在您的类中使用的ApplicationEventPublisher 。 如您在deliver方法中所见我们使用该对象发布事件 this.eventPublisher.publishEvent(new OnOrderDelivered(this)) 。 您可以发布扩展org.springframework.context.ApplicationEvent每个事件。 当订单被推迟时我们引发了另一个事件OnOrderPostponed 。 public abstract class OnOrderStatusChanged extends ApplicationEvent {private final Order order;public OnOrderStatusChanged(Order source) {super(source);this.order source;System.out.println(String.format(Order:%s status is changed to %s, source.getOrderId(), source.getStatus()));}public Order getOrder() {return order;}}public class OnOrderDelivered extends OnOrderStatusChanged {public OnOrderDelivered(Order order) {super(order);}}public class OnOrderPostponed extends OnOrderStatusChanged {public OnOrderPostponed(Order order) {super(order);}} OnOrderStatusChanged是一个抽象类OnOrderDelivered和OnOrderPostponed对其进行了扩展。 到现在为止我们可以创建活动并发起活动。 现在如果您创建一个弹簧测试并调用订单的传递方法您将看到“ OrderX状态更改为DELIVERED”。最后一步是在发布这些事件时执行某些操作。 这些方法提出后我们希望向客户发送电子邮件。 另外对于客户来说在订单处于交付状态时发布产品也很有价值。 侦听器是实现通用ApplicationListener接口的简单Bean。 此接口中的参数类型是您要监听的事件的类型。 可以将参数类型定义为父级并侦听其所有子级。 例如在我们的模型中如果我们使用OnOrderStatusChanged侦听器将捕获OnOrderDelivered和OnOrderPostponed所有事件 在我们的方案中它可能适合发送电子邮件。 但是我们不使用此模型而是为它们创建两个不同的侦听器。 如您所见它们的代码非常简单 Servicepublic class OrderDeliveredEmailSender implements ApplicationListener,Ordered {Overridepublic void onApplicationEvent(OnOrderDelivered event) {System.out.println(String.format(Message sent for delivered order to:%s ORDER-ID:%s,event.getOrder().getCustomerInfo().getEmail(),event.getOrder().getOrderId()));}Overridepublic int getOrder() {return 100;}}Servicepublic class OrderPostponedEmailSender implements ApplicationListener {Overridepublic void onApplicationEvent(OnOrderPostponed event) {System.out.println(String.format(Message sent for postponed order to:%s ORDER-ID:%s, event.getOrder().getCustomerInfo().getEmail(), event.getOrder().getOrderId()));}} 当引发对应事件时这两个bean将触发onApplicationEvent。 为了将产品发布给客户我们需要为OnOrderDelivered事件创建另一个监听器。 Servicepublic class OnOrderDeliveredPost implements ApplicationListener,Ordered {Overridepublic void onApplicationEvent(OnOrderDelivered onOrderDelivered) {System.out.println(String.format(Order:%s is posting for customer.,onOrderDelivered.getOrder().getOrderId()));}Overridepublic int getOrder() {return 1000;}} 如您所见当状态为“已交付”时此侦听器会将产品发送给客户。 但是等一下什么是Ordered接口 如果您没有使用org.springframework.core.Ordered接口那么知道使用此接口可以定义集合中bean之间的顺序是很有价值的。 在我们的方案中客户喜欢在将产品发布给他之前收到一封电子邮件。 为此这两个类实现了Ordered接口不要忘记最低的顺序具有最高的优先级。 *单一责任原则 您可以从以下网址下载源代码 https : //github.com/psycho-ir/spring-event.git 参考 Just另一个Java博客博客中的JCG合作伙伴 Soroosh Sarabadani的Spring 3.x中的如何使用Events 。 翻译自: https://www.javacodegeeks.com/2013/08/how-to-use-events-in-spring-3-x.htmlspring 4.3.x