簡體   English   中英

實體觀察者並不總是有效

[英]Observer on Entity does not always work

我有一個彈簧靴和彈簧數據設置(@Data)。 當一個實體的屬性更改時,我需要執行一些操作。 我正在嘗試使用觀察者模式,因此,當我們從代碼中調用該屬性的設置器時,我在其中添加了stateChanged。 您是否認為這會按預期工作,或者Spring正在召集二傳手?

春天肯定不會不時召集這些二傳手。

要在將實體更新持久存儲在數據庫中之前立即執行自定義代碼,可以在實體類中的方法上使用@PreUpdate批注,或者如果您的@PreUpdate代碼為,則可以在此方法中使用更高級別的抽象實體類相同。

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

這樣做可以從設置器中刪除stateChanged調用。

我們對兩種不同的方案有相似的需求,並且不得不使用兩種不同的解決方案。

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

對於其他情況,我們必須通知應用程序的其他部分有趣的事情。 並不是完全可觀察的模式,但是需求是相似的。 我們使用org.springframework.context.ApplicationEventPublisher和其他Bean使用org.springframework.context.ApplicationListener偵聽所需的事件類型

以我的經驗,第二種方法更清潔,因為班級之間彼此不認識。 但是,如果您的實體是休眠實體,則此方法可能不起作用。

我仍在研究這個問題。 但是..我想我找到了答案。 因為我確定我在春天的環境中看到二傳手在幕后被召喚。 來自自動布線的屬性-建築中的屬性和自動布線

 @Autowired private ServiceTest testService;

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

因此,如果我們在構造器中為該屬性使用自動裝配 ,則可以在春季環境中將觀察者模式應用於實體

仍不能保證1000%。 因此,如果有人擅長該主題,請解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM