2017-04-11 51 views
1

我有一個彈簧引導和彈簧數據設置(@Data)。當一個實體的屬性發生變化時,我需要採取一些行動。我試圖使用觀察者模式,所以當我們從代碼中調用該屬性的setter時,我在那裏添加了stateChanged。你認爲這會如預期那樣工作,還是春天在幕後調用制定者?實體上的觀察者並不總是工作

回答

4

春天絕對不會隨時調用這些設置器。

要在實體更新持續到數據庫中之前執行自定義代碼,您可以在實體類的方法上使用@PreUpdate註釋,或者您可以使用此方法獲得更高級別的抽象實體類,如果您的@PreUpdate代碼是一樣的。

@PreUpdate 
public void onPreUpdate() { 
    //your custom code here 
} 

這樣做,您可以從您的setters中刪除stateChanged調用。

+0

你的意思是說,如果我在setter中保留stateChange,那麼使用該對象的每個查詢都會通知主題? – strash

+0

當序列化數據時,看起來當前版本不會調用setter。我會編輯我的答案。當使用'@ PostLoad'註釋加載一個實體時,您可以發出通知,就像'@ PreUpdate'示例一樣。你想用這些觀察者完成什麼?如果你提出更大的圖片,你可以得到更好的答案。 –

+0

我需要使用亞馬遜SNS發送通知,當某個實體中的屬性發生變化時,是時候通知其所有追隨者 – strash

1

我們對兩種不同情況的需求相似,必須使用兩種不同的解決方案。

對於休眠實體,我們將org.hibernate.event.service.spi.EventListenerRegistry用於會話工廠,並監聽所需的事件,如PRE_UPDATE或SAVE等。在我們的例子中,偵聽器是一個spring bean,並且具有其他應用程序的必需知識。事件監聽器然後通知所需的bean關於事件發生的事情。但是這僅僅是有效的休眠事件。

對於其他情況,我們不得不通知應用程序的其他部分發生了一些有趣的事情。不完全可觀察的模式,但需求相似。我們使用org.springframework.context.ApplicationEventPublisher和其他bean,使用org.springframework.context.ApplicationListener監聽所需類型的事件。

根據我的經驗,第二種方法比類更清晰,因爲類彼此不知道。但是,如果您的實體是休眠實體,則此方法可能無效。

-1

我仍在研究這個問題。但是.. 我想我找到了答案。因爲我確信在春天的環境中,我看到了背景音樂在幕後被調用。 ITS FROM THE AUTOWIRING-一個屬性,自動裝配在構造

@Autowired private ServiceTest testService; 

VS

@Autowired 
public ServiceOther(ServiceTest testService){ 
    this.testService = testService; 
} 

所以觀察模式可以在春天的環境,如果我們使用被應用到實體自動裝配構造函數爲該屬性。

仍然不是1000%確定。所以如果有人擅長這個話題,請解釋一下。