山一程--软件开发--Spring core--POJO 事件通信

目的:Spring IoC 容器内 POJO 通过接口(而非实现)基于事件的通信.发送者与接收者无需感应. 

只有当一个发送者组件与一个接收者组件通信时才行,一个发送者与多个接收者通信时,发送者需要逐一调用接收者.

1.定义一个自定义 ApplicationEvent, 可使用 POJO

2.发布事件,定义一个Bean, 自动装配 ApplicationEventPublisher, 使用其的publishEvent( object) 来发布事件

3.监听事件,定义在ApplicationContext 的 Component, 使用 @EventListener注解 ApplicationListener 接口的 onApplicationEvent(obj) 方法

来处理事件.

 

 

public class CheckoutEvent {

    private final String shoppingCart;
    private final Date time;

    public CheckoutEvent( String shoppingCart, Date time) {
        this.shoppingCart = shoppingCart;
        this.time = time;
    }

    public String getShoppingCart() {
        return shoppingCart;
    }

    public Date getTime() {
        return time;
    }
}
event define
@Component
@EnableAutoConfiguration
public class Cashier {

    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    public void checkout(String shopCart) throws IOException{
        CheckoutEvent checkoutEvent =
                new CheckoutEvent(shopCart,
                new Date());
        applicationEventPublisher.publishEvent(checkoutEvent);
    }
}
发布事件
@Component
public class CheckoutListener  {

    private static final Logger logger = LoggerFactory.getLogger(CheckoutListener.class);

    @EventListener
    public void onApplicationEvent(CheckoutEvent event) {
        logger.info("Checkout event ["+ event.getShoppingCart()+"];time: "+
                event.getTime());
    }
}
listener
@SpringBootApplication
public class SpringCoreApplication {

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

  @Component
  class app implements ApplicationRunner{

    @Autowired
    Cashier cashier;

    @Override
    public void run(ApplicationArguments args) throws Exception {
      cashier.checkout("shop cart");
    }
  }
}
main

 

posted @ 2023-04-12 21:12  君子之行  阅读(13)  评论(0)    收藏  举报