日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

如何在Spring 3.x中使用事件

發(fā)布時間:2023/12/3 javascript 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在Spring 3.x中使用事件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

創(chuàng)建松耦合應(yīng)用程序的概念和技術(shù)很多,Event是其中之一。 事件可以消除代碼中的許多依賴關(guān)系。 有時沒有事件,很難實施SRP *。 Java中的Observable接口可以幫助我們實現(xiàn)事件(通過Observer Pattern)。

但是,等等,這篇文章的目標是關(guān)于Spring Event的快速教程。 Spring具有一些用于創(chuàng)建事件驅(qū)動應(yīng)用程序的好工具。 您可以在一個bean中引發(fā)一個特定的事件,然后在另一個bean中監(jiān)聽它。

想象一個簡單的應(yīng)用程序具有以下要求:

  • 有些訂單的狀態(tài)可能不同
  • 當訂單處于“已交付”或“已推遲”狀態(tài)時,我們需要向客戶發(fā)送電子郵件

滿足需求的第一個(但不是最好的)解決方案是在我們的訂單模型中發(fā)送電子郵件,但是存在一些缺陷:

  • 訂單不負責發(fā)送電子郵件。
  • 如果您遵循域驅(qū)動原則,那么Order是一個域?qū)ο?#xff0c;但Email Sender可能是一項服務(wù)(不同于Domain Service),因此您不能在模型中使用它。

另一個解決方案是在更改其訂單狀態(tài)后在Order模型中引發(fā)一些事件。 我不關(guān)心訂購在引發(fā)此事件之后會發(fā)生什么。 在我們的示例中,我們需要收聽特定類型的事件,對其進行分析并開展一些業(yè)務(wù)(發(fā)送電子郵件)。

@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關(guān)鍵字在任何地方創(chuàng)建,但是它們是由spring管理的,因此您可以在其中注入其他bean或與它們一起使用大多數(shù)spring設(shè)施。 我保證會盡快發(fā)布有關(guān)它的文章。

Order類實現(xiàn)org.springframework.context.ApplicationEventPublisherAware接口。 此接口具有名稱為setApplicationEventPublisher的setter方法,該方法表示要在您的類中使用的ApplicationEventPublisher 。 如您在deliver方法中所見,我們使用該對象發(fā)布事件( this.eventPublisher.publishEvent(new OnOrderDelivered(this)) )。 您可以發(fā)布擴展org.springframework.context.ApplicationEvent每個事件。 當訂單被推遲時,我們引發(fā)了另一個事件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對其進行了擴展。 到現(xiàn)在為止,我們可以創(chuàng)建活動并發(fā)起活動。 現(xiàn)在,如果您創(chuàng)建一個彈簧測試并調(diào)用訂單的傳遞方法,您將看到“ Order:X狀態(tài)已更改為DELIVERED”。最后一步是在發(fā)布這些事件時執(zhí)行某些操作。 這些方法提出后,我們希望向客戶發(fā)送電子郵件。 另外,對于客戶來說,在訂單處于交付狀態(tài)時發(fā)布產(chǎn)品也很有價值。 偵聽器是實現(xiàn)通用ApplicationListener接口的簡單Bean。 此接口中的參數(shù)類型是您要監(jiān)聽的事件的類型。 可以將參數(shù)類型定義為父級,并偵聽其所有子級。 例如在我們的模型中,如果我們使用OnOrderStatusChanged偵聽器將捕獲OnOrderDelivered和OnOrderPostponed所有事件

在我們的方案中,它可能適合發(fā)送電子郵件。 但是我們不使用此模型,而是為它們創(chuàng)建兩個不同的偵聽器。

如您所見,它們的代碼非常簡單

@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()));}}

當引發(fā)對應(yīng)事件時,這兩個bean將觸發(fā)onApplicationEvent。 為了將產(chǎn)品發(fā)布給客戶,我們需要為OnOrderDelivered事件創(chuàng)建另一個監(jiān)聽器。

@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;}}

如您所見,此偵聽器將在狀態(tài)為“已交付”時將產(chǎn)品發(fā)送給客戶。 但是等一下什么是Ordered接口? 如果您沒有使用org.springframework.core.Ordered接口,那么知道使用此接口可以定義集合中bean之間的順序是很有價值的。 在我們的方案中,客戶喜歡在將產(chǎn)品發(fā)布給他之前收到一封電子郵件。 為此,這兩個類實現(xiàn)了Ordered接口,不要忘記最低的順序具有最高的優(yōu)先級。

*單一責任原則

  • 您可以從以下網(wǎng)址下載源代碼: 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.html

總結(jié)

以上是生活随笔為你收集整理的如何在Spring 3.x中使用事件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。