Spring Event是Spring的事件通知机制,可以将相互耦合的代码解耦,从而方便功能的修改与添加。Spring Event是观察者模式的一个具体实现。 Spring Event包含事件(ApplicationEvent)、监听器(ApplicationListener)和事件发布(publishEvent)操作。
Spring Event的相关API在spring-context包中;
实现Spring事件机制主要有4个类:
ApplicationEvent:事件,每个实现类表示一类事件,可携带数据。 ApplicationListener:事件监听器,用于接收事件处理时间。 ApplicationEventMulticaster:事件管理者,用于事件监听器的注册和事件的广播。 ApplicationEventPublisher:事件发布者,委托ApplicationEventMulticaster完成事件发布。
以下示例中使用SpringBoot。
1、引入Maven依赖 1 2 3 4 5 6 7 8 9 10 11 12 13 <parent > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-parent</artifactId > <version > 2.1.3.RELEASE</version > <relativePath /> </parent > <dependencies > <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-web</artifactId > </dependency > </dependencies >
2、自定义事件 Spring提供了事件抽象类ApplicationEvent,继承该抽象类即可。
1 2 3 4 5 6 7 8 9 10 11 12 import org.springframework.context.ApplicationEvent;@Setter @Getter public class MsgEvent extends ApplicationEvent { private String message; public MsgEvent (String message) { super (message); this .message = message; } }
3、发布事件 1、可以直接使用ApplicationEvent.publishEvent(ApplicationEvent);
1 2 3 @Autowired private ApplicationContext applicationContext; applicationContext.publishEvent(ApplicationEvent);
2、通过ApplicationEventPublisher.publishEvent(ApplicationEvent); 直接注入
1 2 3 @Autowired private ApplicationEventPublisher applicationEventPublisher; applicationEventPublisher.publishEvent(ApplicationEvent)
实现接口
1 2 3 4 5 6 7 8 @Service public class PublishEvent implements ApplicationEventPublisherAware { public static ApplicationEventPublisher eventPublisher = null ; @Override public void setApplicationEventPublisher (ApplicationEventPublisher applicationEventPublisher) { eventPublisher.publishEvent("事件消息" ); } }
4、事件监听 处理发布的事件 1、通过实现接口ApplicationListener
1 2 3 4 5 6 7 8 @Component public class MsgEventListener implements ApplicationListener <MsgEvent> { @Override public void onApplicationEvent (TestEvent event) { System.out.println("监听到消息: " + event.getMessage()); } }
2、使用@EventListener注解
1 2 3 4 5 6 7 8 9 @Component public class MsgEventListener { @Order(5) @EventListener public void listener (MsgEvent event) { System.out.println("注解监听到数据:" + event.getMessage()); } }
如果有多个监听器,可以通过@Order注解指定监听器执行顺序,@Order中value的值越小,越先执行; 事件监听器默认是同步执行的,如果想要异步执行,可以添加@Async注解(启动类上加@EnableAsync),实际业务开发中要注意@Async的使用。
5、测试事件发布监听 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.annotation.ComponentScan;@ComponentScan("cn.river.spring.event") public class ApplicationListenerDemo { public static void main (String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext (ApplicationListenerDemo.class); context.publishEvent("123123" ); MsgEvent msgEvent = new MsgEvent ("发送短信" ); context.publishEvent(msgEvent); } }