繁体   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