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