Loading... ## 导读: 实现组件解耦的方式,目前我了解的有两种:**AOP**、**发送事件对象** ### 区别: * AOP:好像权力更大,在不修改原有代码的基础上追加功能,此时的类对象是**不知情的** * 发送事件对象:在类对象中,我们发布一个**监听器事件**,此时类对象是**知情的**,然后我们通过一个监听器连接到类对象,一旦类对象执行,监听器会监听到事件对象,监听器也会相应的执行。 ## 第一种:(AOP) ### 导入坐标: ```java <!--切入点表达式依赖,目的是找到切入点方法,也就是找到要增强的方法--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.9.1</version> </dependency> ``` ### 引导类开启AOP切面代理 ```java @SpringBootApplication // 开启切面自动代理(AOP) @EnableAspectJAutoProxy public class TestApplication { public static void main(String[] args) { final ConfigurableApplicationContext context = SpringApplication.run(TestApplication.class, args); } } ``` ### 切点: ```java @Component public class LoginController { public void login(){ System.out.println("user login"); } } ``` ### AOP ```java @Component // 设置当前类为切面类 @Aspect public class LoginAop { // 设置切入点,@Pointcut注解要求配置在方法上方 @Pointcut("execution(void com.bdmcom.controller.LoginController.login())") private void send(){} // 设置在切入点send()开启环绕通知 @Around("send()") public Object around(ProceedingJoinPoint pjp) throws Throwable { System.out.println("send sms"); Object ret = pjp.proceed(); return ret; } } ``` ### Test ```java @SpringBootTest class TestApplicationTests { @Autowired public LoginController loginController; @Test void contextLoads() { loginController.login(); } } ``` ### 执行结果: > user login > send sms ## 第二种:(事件对象) ### 应用事件: ```java @Component public class LoginController extends ApplicationEvent { public LoginController( Object source) { super(source); } } ``` ### 应用事件发布: ```java @Component public class Component1 { @Autowired private ApplicationEventPublisher context; public void login() { System.out.println("user login"); context.publishEvent(new LoginController(this)); } } ``` ### 事件监听: ```java @Component public class Component2 { @EventListener public void aaa(LoginController event) { System.out.println("send sms"); } } ``` ### 事件执行: ```java @SpringBootApplication // 开启切面自动代理(AOP) @EnableAspectJAutoProxy public class TestApplication { public static void main(String[] args) { final ConfigurableApplicationContext context = SpringApplication.run(TestApplication.class, args); // 4.发送事件对象:实现组件之间的解耦 context.getBean(Component1.class).login(); } } ``` ### 流程图:  最后修改:2022 年 08 月 19 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果文章有用,请随意打赏。