SpringEvent基本使用

发布于:2022-11-28 ⋅ 阅读:(414) ⋅ 点赞:(0)

SpringEvent基本使用

  1. SpringEvent应用场景

    • 实际业务开发过程中,业务逻辑可能非常复杂,核心业务 + N 个子业务。如果都放到一块儿去做,代码可能会很长,耦合度不断攀升,维护起来也麻烦,甚至头疼。还有一些业务场景需要在一次请求中同步完成,比如邮件发送、短信发送等。 Spring Event(Application Event)
    • 其实就是一个观察者设计模式,一个 Bean 处理完成任务后希望通知其它 Bean 或者说一个 Bean 想观察监听另一个Bean 的行为。
  2. 使用

    1. 废话不多说,直接撸代码

    2. //创建普通的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>
      
    3. DemoApplication.class

    4. @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("执行完毕 ....");
          }
      
      }
      
      
    5. User.class

    6. @Data
      @AllArgsConstructor
      public class User {
          private String username;
          private Integer age;
      }
      
      
    7. ListenerTest.class

    8. @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);
          }
      
      }
      
    9. PublishTest.class

    10. @Component
      public class PublishTest {
      
          @Resource
          private ApplicationEventPublisher applicationEventPublisher;
      
          public void save(User user){
      
              if (true) {
                  applicationEventPublisher.publishEvent(user);
                  applicationEventPublisher.publishEvent(new Date());
              }
              // return "ok";
          }
      
      
      }
      
  3. 我们来看看@Listerner的属性

    1. @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 "";
      }
      
    2. value: 指定什么类型就监听、接受什么类型的参数,如发送一个"User", 那么value=User.class,否则监听器不执行。

    3. classes: 同value

    4. condition:可以使用EL表达式。如#age>10,如果不满足此条件,监听器不执行。

    5. id 侦听器的可选标识符,默认为完全限定的 声明方法的签名(例如“mypackage”。MyClass.myMethod()")

  4. 总结: 事件发布器发布什么类型的数据,事件接收器就要接受什么类型的数据, 否则就会接收不到。

  5. 基本的使用很简单,具体就看各位同学在实际场景中的一个应用了。


视频详细教程:https://www.bilibili.com/video/BV1624y197m9/
Gitee项目地址:https://gitee.com/a2558314916_admin/spring-event

本文含有隐藏内容,请 开通VIP 后查看