练习-使用ApplicationContext中事件发送以及AOP来实现代码解耦

案例要求

  • 将用户注册与用户发送消息之间进行解耦

实现

  • ApplicationContext接口

  • 具体文章见:BeanFactory与ApplicationContext_熵240的博客-CSDN博客
    • 创建事件类
      • package com.example;
        
        import org.springframework.context.ApplicationEvent;
        
        public class UserRegisteredEvent extends ApplicationEvent {
            public UserRegisteredEvent(Object source) {
                super(source);
            }
        }
        
    • 用户注册事件

      • package com.example;
        
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.context.ApplicationEventPublisher;
        import org.springframework.stereotype.Component;
        
        @Component
        public class Component01 {
            @Autowired
            ApplicationEventPublisher applicationEventPublisher;
        
            public void Event() {
                System.out.println("用户注册");
                applicationEventPublisher.publishEvent(new UserRegisteredEvent(this));
            }
        }
        
    • 发送信息事件

      • package com.example;
        
        import org.springframework.context.event.EventListener;
        import org.springframework.stereotype.Component;
        
        @Component
        public class Component02 {
            @EventListener
            public void EventLister(UserRegisteredEvent userRegisteredEvent) {
                System.out.println("发送短信");
            }
        }
        
    • 在启动类中运行用户注册事件

      • package com.example;
        
        import org.springframework.boot.SpringApplication;
        import org.springframework.boot.autoconfigure.SpringBootApplication;
        import org.springframework.context.ConfigurableApplicationContext;
        
        
        // Generated by https://start.springboot.io
        // 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn
        @SpringBootApplication
        public class Application {
        
            public static void main(String[] args) {
        
                ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
                context.getBean(Component01.class).Event();
            }
        
        }
        
    • 运行结果如下:

  • AOP(面前切面编程)

    • 具体文章见: AOP- CSDN搜索
       
    • 创建AOP类
      • package com.example;
        
        import lombok.extern.slf4j.Slf4j;
        import org.aspectj.lang.ProceedingJoinPoint;
        import org.aspectj.lang.annotation.Around;
        import org.aspectj.lang.annotation.Aspect;
        import org.springframework.stereotype.Component;
        
        @Aspect
        @Component
        @Slf4j
        public class AOP {
            @Around("execution(* com.example.Component01.*(..))")
            public void Message(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
                proceedingJoinPoint.proceed();
                log.info("信息发送");
            }
        }
        
    • 创建目标对象所对应的类

      • package com.example;
        
        import lombok.extern.slf4j.Slf4j;
        import org.springframework.stereotype.Component;
        
        @Component
        @Slf4j
        public class Component01 {
            public void Event() {
                log.info("用户注册");
            }
        }
        
    • 在启动类中调用目标对象的方法

      • package com.example;
        
        import org.springframework.boot.SpringApplication;
        import org.springframework.boot.autoconfigure.SpringBootApplication;
        import org.springframework.context.ConfigurableApplicationContext;
        
        
        // Generated by https://start.springboot.io
        // 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn
        @SpringBootApplication
        public class Application {
        
            public static void main(String[] args) {
        
                ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
                context.getBean(Component01.class).Event();
            }
        
        }
        

区别

  • ApplicationContext中事件发送是一种松耦合的通信方式,适用于应用内部组件之间的消息传递,可以通过事件对象携带数据。
  • AOP是一种通过横切关注点的模块化来实现代码解耦的方式,适用于将横切逻辑(重复的逻辑功能)与业务逻辑(各自的功能逻辑)分离,实现代码重用和维护的目的。
  • 事件发送是一种事件驱动的方式,事件发布者不需要关心具体的监听者,而AOP是通过切面和通知来实现横切逻辑的织入,需要明确指定切面和通知的位置和规则。
  • 事件发送是一对多的关系,一个事件可以被多个监听者接收,而AOP是通过切面来定义在何处应用通知的规则,切面可以被多个目标对象共享。
  • 事件发送是在运行时动态触发事件,而AOP可以在编译期、运行期或加载期进行织入(不同的通知类型实现)。

你可能感兴趣的:(Spring,5,java,开发语言)