SpringBoot的事件Event

以创建订单并发布订单事件为例,假设我们现在有一个“下单”操作,每当用户下单时,系统需要创建订单并将该订单信息发布出去,以便其他模块(比如发送邮件、打印、短信等)能做相应的处理。

事件机制通过 事件发布、监听 和 处理 来实现。我们可以在下单操作完成后,发布一个订单事件,让其他模块可以监听到该事件并做出相应的处理。

例如,我们可以创建一个订单实体类,其中包括订单编号、买家ID、订单金额等信息,然后在下单操作完成后,将这个订单实体类传递给一个订单服务。订单服务将会完成以下两个操作:

  • 发布订单事件 - 订单事件将包括订单实体类的信息,发布事件后,其他模块就可以监听该事件并做出相应的处理(比如给买家发邮件、更新订单状态等)。

  • 存储订单到数据库 - 将订单信息存储到数据库中,以便后续查询和使用。

项目的目录结构:

├── config
│   └── AppConfig.java
├── entity
│   └── Order.java
├── event
│   ├── OrderEvent.java
│   ├── OrderEventListener.java
│   └── OrderEventPublisher.java
├── repository
│   └── OrderRepository.java
├── service
│   └── OrderService.java
└── SpringBootDemoApplicatio

1. 实体类 Order

@Entity
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "order_no")
    private String orderNo;

    @Column(name = "buyer_id")
    private Long buyerId;

    @Column(name = "total_amount")
    private BigDecimal totalAmount;

    // getter and setter
}

2. 订单 Repository

使用 Spring Data JPA 提供的 Repository 来操作数据库。

@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {
}

3. 订单相关服务

服务包括:创建订单、发布订单事件、存储订单到数据库。

@Service
public class OrderService {
    @Autowired
    private OrderEventPublisher publisher;

    @Autowired
    private OrderRepository repository;

    @Transactional
    public void createOrder(Order order) {
        // 1. 发布订单事件
        publisher.publishEvent(order);

        // 2. 存储订单到数据库
        repository.save(order);
    }
}

4. 订单创建事件

public class OrderEvent extends ApplicationEvent {
    private Order order;

    public OrderEvent(Object source, Order order) {
        super(source);
        this.order = order;
    }

    public Order getOrder() {
        return order;
    }
}

5. 订单事件监听器

public class OrderEventListener implements ApplicationListener<OrderEvent> {
    @Override
    public void onApplicationEvent(OrderEvent event) {
        Order order = event.getOrder();
        System.out.println("订单事件监听器:" + order);
        // do something
    }
}

6. 订单事件发布器

@Service
public class OrderEventPublisher implements ApplicationEventPublisherAware {
    private ApplicationEventPublisher publisher;

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
        this.publisher = publisher;
    }

    public void publishEvent(Order order) {
        OrderEvent event = new OrderEvent(this, order);
        this.publisher.publishEvent(event);
    }
}

7. 启动类

@SpringBootApplication
public class SpringBootDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoApplication.class, args);
    }

    @Autowired
    private OrderService orderService;

    @Bean
    public OrderEventListener orderEventListener() {
        return new OrderEventListener();
    }

    @Bean
    public ApplicationRunner applicationRunner(OrderRepository repository) {
        return args -> {
            // 模拟创建订单
            Order order = new Order();
            order.setOrderNo(UUID.randomUUID().toString());
            order.setBuyerId(1L);
            order.setTotalAmount(new BigDecimal("199.99"));

            // 创建订单
            orderService.createOrder(order);
        };
    }
}

8. 总结

事件机制是一种实现模块之间解耦合的方案。在软件开发过程中,不同的模块之间需要完成数据交互和流程调度。同时,业务场景与数据的变化也会影响到应用程序的行为。此时,实现模块之间的解耦合便非常有必要。事件机制就是一种能够响应业务场景和数据变化的方案,当某些操作发生时,事件机制通知应用程序中的其他部分。事件机制的设计可以分离关注点,并且可以更容易地扩展新的功能。

关注微信公众号:“小虎哥的技术博客”。我们会定期发布关于Java技术的详尽文章,让您能够深入了解该领域的各种技巧和方法,让我们一起成为更优秀的程序员‍‍!

你可能感兴趣的:(spring,boot,后端,事件)