天天看點

1.spring-事件釋出與處理

文章目錄

  • ​​部落格概述​​
  • ​​關于service層​​
  • ​​spring的事件釋出與監聽​​
  • ​​事件釋出者​​
  • ​​事件對象​​
  • ​​事件監聽對象​​

部落格概述

本文的主要内容是說的spring的事件釋出與處理的具體的應用。是作者常年搬磚得出來的一些經驗用法,讓正常的controller-service-dao-entity的設計增加一些新的活力。

關于service層

提到service層,最直覺的了解就是業務邏輯層,這一層調用資料通路對象,對業務邏輯進行拼接,讓資料關聯。大家都這麼用,是以說這種設計成了規範。有一天,我寫了一個巨長對service方法,而且内部業務關聯性,沒有想的那麼高,怎麼了解呢?就比如發短信提醒的業務,也要放在service裡面,但是他跟業務流之間的關系,沒有那麼密切,卻是不可缺少的一環。業務操作成功,短信發送失敗,不能作為操作失敗的理由,是程式的原因,這種情況下,使用事務會導緻復原讓使用者的操作失敗,顯然是不科學的,那這種情況該如何處理呢?

spring的事件釋出與監聽

在web項目中,遇到上述的場景可以使用spring的事件釋出與監聽機制。這個功能主要有三個對象

  • 被釋出的事件
  • 事件的監聽者
  • 事件釋出者

事件釋出者

在web項目中,一般都會用spring來做IOC容器,ApplicationContext對象具有釋出事件的能力。這是因為該接口繼承了ApplicationEventPublisher接口。Spring中與事件有關的接口和類主要包括ApplicationEvent、ApplicationListener。

我們可以輕松的注入和釋出事件。

//注入元件中ApplicationContext對象代碼
@Autowired
private ApplicationContext applicationContext;      

釋出事件也隻是一句話的事情。封裝的非常簡單。案例如下,其中event繼承了ApplicationEvent

applicationContext.publishEvent(new event());      

事件對象

事件對象往往對應着使用者的某個操作,在某個service裡面被發出。事件案例如下,其中source為調用的對象

@Getter
@Setter
public class Push extends ApplicationEvent {

    private Bid bid;

    public Push(Object source, Bid bid) {
        super(source);
        this.bid = bid;
    }
}      

事件監聽對象

@Component
public class PushBidSms implements ApplicationListener<Push> {

    @Autowired
    private SmsUtil smsUtil;

    @Override
    public void onApplicationEvent(Push event) {
        Bid bid = event.getBid();
        //有人出價之後,向産品的賣方,發短信。
        String phone = bid.getSeller().getPhone();
        if (!StringUtil.isNullOrEmpty(phone)) {
            smsUtil.send(phone, "xxxx");
        }

    }
}