我有一個彈簧引導和彈簧數據設置(@Data)。當一個實體的屬性發生變化時,我需要採取一些行動。我試圖使用觀察者模式,所以當我們從代碼中調用該屬性的setter時,我在那裏添加了stateChanged。你認爲這會如預期那樣工作,還是春天在幕後調用制定者?實體上的觀察者並不總是工作
1
A
回答
4
春天絕對不會隨時調用這些設置器。
要在實體更新持續到數據庫中之前執行自定義代碼,您可以在實體類的方法上使用@PreUpdate註釋,或者您可以使用此方法獲得更高級別的抽象實體類,如果您的@PreUpdate代碼是一樣的。
@PreUpdate
public void onPreUpdate() {
//your custom code here
}
這樣做,您可以從您的setters中刪除stateChanged調用。
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%確定。所以如果有人擅長這個話題,請解釋一下。
相關問題
- 1. 原型事件觀察者不工作
- 2. 爲什麼不是突變觀察者的工作?
- 3. Rails的觀察不工作
- 4. 觀察者模式不能在Ruby上工作
- 5. 誰是觀察者,誰是可觀察者?
- 6. 將工作推向觀察者
- 7. 觀察者模式 - 觀察者創建
- 8. 觀察者模式 - 可觀察的需要總是抽象的嗎?
- 9. Java觀察者和可觀察的
- 10. 創建可觀察的並獲得觀察者在RXJS 5.0中
- 11. Android「觀察者」
- 12. in firebase如何刪除所有觀察者,而不是觀察者的具體參考
- 13. 當觀察者的觀察者的壽命長於可觀察到的
- 14. 實體框架SaveChanges並不總是工作
- 15. Android:內容觀察者的內容://短信/發送不工作
- 16. 取消可觀察訂閱並等待觀察者完成
- 17. 指令中總是需要額外的觀察者嗎?
- 18. 觀察者不會在行爲中工作?
- 19. Quartz.net並不總是工作
- 20. 觀察者模式Java - 使用線程的多個觀察者
- 21. 初學者JavaFX觀察者
- 22. 觀察者模式
- 23. NSInternalInconsistencyException觀察者contentSize
- 24. 實現C++ -to-lua觀察者模式?
- 25. 使用winforms實現觀察者模式
- 26. 實施了「靜態觀察者模式」
- 27. 作爲NSNotification觀察者的類?
- 28. 觀察者控制器的動作
- 29. GWT上的觀察者模式
- 30. 文件更改觀察者工具
你的意思是說,如果我在setter中保留stateChange,那麼使用該對象的每個查詢都會通知主題? – strash
當序列化數據時,看起來當前版本不會調用setter。我會編輯我的答案。當使用'@ PostLoad'註釋加載一個實體時,您可以發出通知,就像'@ PreUpdate'示例一樣。你想用這些觀察者完成什麼?如果你提出更大的圖片,你可以得到更好的答案。 –
我需要使用亞馬遜SNS發送通知,當某個實體中的屬性發生變化時,是時候通知其所有追隨者 – strash