SpringEvent基本使用
SpringEvent应用场景
- 实际业务开发过程中,业务逻辑可能非常复杂,核心业务 + N 个子业务。如果都放到一块儿去做,代码可能会很长,耦合度不断攀升,维护起来也麻烦,甚至头疼。还有一些业务场景需要在一次请求中同步完成,比如邮件发送、短信发送等。 Spring Event(Application Event)
- 其实就是一个观察者设计模式,一个 Bean 处理完成任务后希望通知其它 Bean 或者说一个 Bean 想观察监听另一个Bean 的行为。
使用
-
废话不多说,直接撸代码
//创建普通的springboot项目即可, 为了方便引入了lombok <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
DemoApplication.class
@SpringBootApplication @Slf4j @EnableAsync public class DemoApplication { public static void main(String[] args) { ConfigurableApplicationContext applicationContext = SpringApplication.run(DemoApplication.class, args); PublishTest publishTest = applicationContext.getBean("publishTest", PublishTest.class); User zs = new User("zs", 10); publishTest.save(zs); log.info("执行完毕 ...."); } }
User.class
@Data @AllArgsConstructor public class User { private String username; private Integer age; }
ListenerTest.class
@Component @Slf4j public class ListenerTest { @EventListener @Async public void email(User user) { try { Thread.sleep(3000); } catch (InterruptedException e) { throw new RuntimeException(e); } log.info("user info = {}", user); } @EventListener @Order(100) public void email2(User user) { log.info("order 100,{}",user); } @EventListener @Order(50) public void email3(User user) { log.info("order 50,{}",user); } @EventListener(value = Date.class) @Order(50) public void email4(Date date) { log.info("date info ,{}",date); } }
PublishTest.class
@Component public class PublishTest { @Resource private ApplicationEventPublisher applicationEventPublisher; public void save(User user){ if (true) { applicationEventPublisher.publishEvent(user); applicationEventPublisher.publishEvent(new Date()); } // return "ok"; } }
-
我们来看看@Listerner的属性
-
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented public @interface EventListener { @AliasFor("classes") Class<?>[] value() default {}; @AliasFor("value") Class<?>[] classes() default {}; String condition() default ""; String id() default ""; }
value: 指定什么类型就监听、接受什么类型的参数,如发送一个"User", 那么value=User.class,否则监听器不执行。
classes: 同value
condition:可以使用EL表达式。如#age>10,如果不满足此条件,监听器不执行。
id 侦听器的可选标识符,默认为完全限定的 声明方法的签名(例如“mypackage”。MyClass.myMethod()")
总结:
事件发布器
发布什么类型的数据,事件接收器
就要接受什么类型的数据, 否则就会接收不到。基本的使用很简单,具体就看各位同学在实际场景中的一个应用了。
视频详细教程:https://www.bilibili.com/video/BV1624y197m9/
Gitee项目地址:https://gitee.com/a2558314916_admin/spring-event
本文含有隐藏内容,请 开通VIP 后查看