文章目錄
- 部落格概述
- 關于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");
}
}
}