生命周期事件

Spring Data JDBC 将生命周期事件发布到 ApplicationListener 对象,这些对象通常是应用程序上下文中的 bean。事件是关于特定生命周期阶段的通知。与实体回调不同,事件旨在用于通知。事务侦听器将在事务完成时接收事件。事件和回调仅针对聚合根触发。如果您想处理非根实体,则需要通过包含聚合根的侦听器进行处理。

实体生命周期事件可能代价高昂,在加载大量结果集时,您可能会注意到性能配置文件发生变化。您可以在模板 API 上禁用生命周期事件。

例如,在聚合保存之前会调用以下侦听器

@Bean
ApplicationListener<BeforeSaveEvent<Object>> loggingSaves() {

    return event -> {

        Object entity = event.getEntity();
        LOG.info("{} is getting saved.", entity);
    };
}

如果您只想处理特定域类型的事件,您可以从 AbstractRelationalEventListener 派生侦听器并覆盖一个或多个 onXXX 方法,其中 XXX 代表事件类型。回调方法将仅针对与域类型及其子类型相关的事件调用,因此您不需要进一步的类型转换。

class PersonLoadListener extends AbstractRelationalEventListener<Person> {

    @Override
    protected void onAfterLoad(AfterLoadEvent<Person> personLoad) {
		LOG.info(personLoad.getEntity());
    }
}

下表描述了可用事件。有关过程步骤之间确切关系的更多详细信息,请参阅与事件 1:1 映射的可用回调的描述

表 1. 可用事件
事件 发布时间

BeforeDeleteEvent

在聚合根被删除之前。

AfterDeleteEvent

在聚合根被删除之后。

BeforeConvertEvent

在聚合根转换为执行 SQL 语句的计划之前,但在决定聚合是新的还是已存在的之后(即是否进行更新或插入)。

BeforeSaveEvent

在聚合根保存之前(即插入或更新之前,但在决定是插入还是更新之后)。

AfterSaveEvent

在聚合根保存之后(即插入或更新之后)。

AfterConvertEvent

在从数据库 ResultSet 创建聚合根并设置其所有属性之后。

生命周期事件依赖于 ApplicationEventMulticaster,在 SimpleApplicationEventMulticaster 的情况下,可以配置 TaskExecutor,因此不保证事件何时处理。

特定于存储的 EntityCallbacks

Spring Data JDBC 使用 EntityCallback API 来支持审计,并对下表中列出的回调做出反应。

表 2. Spring Data JDBC 执行的不同过程的步骤和回调。
过程 EntityCallback / 过程步骤 注释

删除

BeforeDeleteCallback

在实际删除之前。

聚合根及其所有实体都将从数据库中删除。

AfterDeleteCallback

在聚合删除之后。

保存

根据聚合是否为新聚合来确定是执行插入还是更新。

BeforeConvertCallback

如果您想以编程方式设置 ID,这是一个正确的 Callback。在上一步中,新的聚合被检测到,并且在此步骤中生成的 ID 将在下一步中使用。

将聚合转换为聚合更改,它是一系列要针对数据库执行的 SQL 语句。在此步骤中,决定是否由聚合提供 ID,或者 ID 是否仍然为空并预期由数据库生成。

BeforeSaveCallback

对聚合根所做的更改可能会被考虑,但 ID 值是否会发送到数据库的决定已在上一步中做出。请勿将其用于为新聚合创建 ID。请改用 BeforeConvertCallback

上面确定的 SQL 语句将针对数据库执行。

AfterSaveCallback

在聚合根保存之后(即插入或更新之后)。

加载

使用 1 个或多个 SQL 查询加载聚合。从结果集中构建聚合。

AfterConvertCallback

我们鼓励使用回调而不是事件,因为它们支持使用不可变类,因此比事件更强大和通用。

© . This site is unofficial and not affiliated with VMware.