Spring Boot 2.x实战67 - Spring Data 11 - Spring Data JPA事件监听

2.7 事件监听

我们可以在聚合根实体上注解下面的注解来监听聚合操作的事件。

  • @PrePersist:监听实体保存前事件;
  • @PostPersist:监听实体保存后事件;
  • @PreUpdate:监听实体更新前事件;
  • @PostUpdate:监听实体更新后事件;
  • @PreRemove:监听实体删除前事件;
  • @PostRemove:监听实体删除后事件;
  • @PostLoad:监听实体加载后事件。
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class Person {
    //...
    @PrePersist
    public void prePersist(){
        System.out.println("prePersist:" + this);
    }

    @PostPersist
    public void postPersist(){
        System.out.println("postPersist:" + this);
    }

    @PreRemove
    public void preRemove(){
        System.out.println("preRemove:" + this);
    }

    @PostRemove
    public void postRemove(){
        System.out.println("postRemove:" + this);
    }

    @PreUpdate
    public void preUpdate(){
        System.out.println("preUpdate:" + this);
    }

    @PostUpdate
    public void postUpdate(){
        System.out.println("postUpdate:" + this);
    }

    @PostLoad
    public void postLoad(){
        System.out.println("postLoad:" + this);
    }

}

我们使用代码验证一下:

@Bean
CommandLineRunner entityListeners(PersonRepository personRepository){
   return args -> {
      Address address = new Address("wuhan","Hubei");
      Collection<Child> children = Arrays.asList(new Child("xxx", Gender.FEMALE));
      Person savedPerson = personRepository.save(new Person("www", 33, address, children));
      savedPerson.setAge(34);
      Person updatedPerson =  personRepository.save(savedPerson);
      personRepository.delete(updatedPerson);
   };
}

在这里插入图片描述

在实体类中写大量的代码显然不好,我们可以通过@EntityListeners({PersonListener.class})来指定其他的类来处理。若需要让Spring对当前事件进行处理的话,我们可以使用@Configurable注解该类将依赖注入到非Spring容器管理且在Spring容器之外初始化的类中。

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@EntityListeners({PersonListener.class})
public class Person {}
@Configurable
public class PersonListener {
    private ListenerService listenerService;

    public PersonListener(ListenerService listenerService) {
        this.listenerService = listenerService;
    }

    @PrePersist
    public void prePersist(Person person){
        listenerService.process("prePersist:" + person);
    }

    @PostPersist
    public void postPersist(Person person){
        listenerService.process("postPersist:"+ person);
    }

    @PreRemove
    public void preRemove(Person person){
        listenerService.process("preRemove:" + person);
    }
    @PostRemove
    public void postRemove(Person person){
        listenerService.process("postRemove:" + person);
    }

    @PreUpdate
    public void preUpdate(Person person){
        listenerService.process("preUpdate:" + person);
    }

    @PostUpdate
    public void postUpdate(Person person){
        listenerService.process("postUpdate:" + person);
    }

    @PostLoad
    public void postLoad(Person person){
        listenerService.process("postLoad:" + person);
    }
}

被注入的依赖:

@Service
public class ListenerService {
    public void process(String msg){
        System.out.println("由Spring处理:" + msg);
    }
}

再次运行检验:

在这里插入图片描述

新书推荐:

我的新书《从企业级开发到云原生微服务:Spring Boot 实战》已出版,内容涵盖了丰富Spring Boot开发的相关知识
购买地址:https://item.jd.com/12760084.html
在这里插入图片描述

主要包含目录有:

第一章 初识Spring Boot(快速领略Spring Boot的美丽)
第二章 开发必备工具(对常用开发工具进行介绍:包含IntelliJ IDEA、Gradle、Lombok、Docker等)
第三章 函数式编程
第四章 Spring 5.x基础(以Spring 5.2.x为基础)
第五章 深入Spring Boot(以Spring Boot 2.2.x为基础)
第六章 Spring Web MVC
第七章 数据访问(包含Spring Data JPA、Spring Data Elasticsearch和数据缓存)
第八章 安全控制(包含Spring Security和OAuth2)
第九章 响应式编程(包含Project Reactor、Spring WebFlux、Reactive NoSQL、R2DBC、Reactive Spring Security)
第十章 事件驱动(包含JMS、RabbitMQ、Kafka、Websocket、RSocket)
第11章 系统集成和批处理(包含Spring Integration和Spring Batch)
第12章 Spring Cloud与微服务
第13章 Kubernetes与微服务(包含Kubernetes、Helm、Jenkins、Istio)
多谢大家支持。

猜你喜欢

转载自blog.csdn.net/wiselyman/article/details/106537784