# spring 事件简介

#### 一、实现原理

#####  使用了设计模式当中的观察者模式，该模式是定义了一种一对多的依赖关系，多个观察者可以监听同一个主题对象，当这个对象发生变化时，会通知相应的观察者会做出相应的变化。

#### 二、组成

- ##### 事件监听器：需要继承ApplicationListener或定义@EventListener,用于监听和处理特定的事件
- ##### 事件类：需要继承ApplicationEvent或子类，用于封装事件的具体信息
- ##### 事件发布者：用于发布事件，应用上下文ApplicationContext已实现 ApplicationEventPublisher
- ##### 事件广播器：`ApplicationEventMulticaster`用于管理事件监听器的注册和事件的广播。


#### 三、特性

- ##### 解耦：通过事件机制，发起事件的组件不需要关心谁执行，处理事件的组件也不需要关心来源，从而降低了组件之间的耦合度；
- ##### 异步处理：spring事件支持异步处理，事件可以在不同的线程中执行，从而提高了响应速度及并发性
- ##### 灵活性: 新的事件可以轻松的连接到事件流程里面，从而不需要修改原来的代码，容易扩展
- ##### 应用场景广泛：可以应用在数据更新通知、日志处理、异步任务触发等

#### 四、示例

```java
// 定义事件类  
public class CustomEvent extends ApplicationEvent {  
    private String message;  
  
    public CustomEvent(Object source, String message) {  
        super(source);  
        this.message = message;  
    }  
  
    public String getMessage() {  
        return message;  
    }  
}  
  
// 定义事件监听器  
@Component  
public class CustomEventListener implements ApplicationListener<CustomEvent> {  
    @Override  
    public void onApplicationEvent(CustomEvent event) {  
        System.out.println("Received CustomEvent: " + event.getMessage());  
    }  
}  
  
// 或者使用@EventListener注解  
@Component  
public class AnotherCustomEventListener {  
    @EventListener  
    public void handleCustomEvent(CustomEvent event) {  
        System.out.println("Another CustomEvent received: " + event.getMessage());  
    }  
}  
  
// 发布事件  
@Component  
public class CustomEventPublisher {  
    @Autowired  
    private ApplicationEventPublisher publisher;  
  
    public void publishCustomEvent(String message) {  
        CustomEvent customEvent = new CustomEvent(this, message);  
        publisher.publishEvent(customEvent);  
    }  
}
```