Spring ApplicationContext的事件机制是什么?在Nacos中如何应用?

简介: Spring ApplicationContext的事件机制是什么?在Nacos中如何应用?

一、概述

>1 ApplicationContext简述

官方如是描述:
在这里插入图片描述

1) ApplicationContext是Spring中的核心接口和容器,允许容器通过应用程序上下文环境创建、获取、管理bean。
2)在构建容器的时候,创建对象采用的策略是 立即加载的方式,即只要一读取完配置文件就立即创建配置文件中配置的对象。

>2 ApplicationContext事件机制简述

ApplicationContext.publishEvent(事件机制)是Spring提供的解耦的一种方式,采用观察者设计模式;我们可以使用 MQ或 线程池 来代替它。

  • ApplicationContext中的事件处理是通过ApplicationEvent事件类和ApplicationListener事件监听器接口提供的;
  • 事件机制的3要素:事件发布者(ApplicationContext)、事件(ApplicationEvent)、事件监听器(EventListener / ApplicationListener);

>3 事件触发 && 监听处理过程

(1)通过ApplicationContext的publishEvent()方法将事件发布ApplicationListener(EventListener的子类) / EventListener; 通知事件监听器处理事件;

(2)事件监听器通过实现的ApplicationListener#onApplicationEvent()方法处理事件

总结: ApplicationEvent事件 --> ApplicationContext.publishEvent()发布事件 --> 触发EventListener/ ApplicationListener监听器 --> 监听器执行内部onApplicationEvent(ApplicationEvent e)方法。

所以,只需要在容器中注册实现了ApplicationListener的Bean,当ApplicationContext发布事件时,事件会被监听器自动捕获。

>4 注意点

(1) ApplicationContext.publishEvent 默认是同步操作, 并非发布后不管的异步操作,发布事件后需要等 EventListener / ApplicationListener 执行完;

(2) 如果需要开启异步操作 需要在EventListener / ApplicationListener子类上增加 @Async 注解

二、在Nacos中的应用(事件机制的使用)

我们从要发布的事件、发布事件、处理事件三个方面来看。

>1 要发布的事件

自定义的事件只需继承ApplicationEvent即可。

public class ServiceChangeEvent extends ApplicationEvent {
    
    private Service service;
    
    public ServiceChangeEvent(Object source, Service service) {
        super(source);
        this.service = service;
    }
    
    public Service getService() {
        return service;
    }
}

>2 发布事件

如果想让Spring Bean在业务过程发布指定容器事件,需要先让Bean获得ApplicationContext容器的引用,然后将指定容器事件Event交由ApplicationContext发布。

在Nacos中,UdpPushService类中持有ApplicationContext容器的引用:
在这里插入图片描述

UdpPushService类中将ServiceChangeEvent事件交由ApplicationContext发布:

this.applicationContext.publishEvent(new ServiceChangeEvent(this, service));

>3 处理事件

实现ApplicationListener接口的onApplicationEvent()方法,在该方法中做事件处理;

@Component
@SuppressWarnings("PMD.ThreadPoolCreationRule")
public class UdpPushService implements ApplicationContextAware, ApplicationListener<ServiceChangeEvent> {
    @Override
    public void onApplicationEvent(ServiceChangeEvent event) {
        // todo 处理业务逻辑
        // If upgrade to 2.0.X, do not push for v1.
        if (ApplicationUtils.getBean(UpgradeJudgement.class).isUseGrpcFeatures()) {
            return;
        }
        .......
                    // 发送UDP请求
                    udpPush(ackEntry);
        .......
}

三、补充

更多内容可以请见Spring官网: https://docs.spring.io/spring-framework/docs/5.2.19.RELEASE/spring-framework-reference/core.html#context-functionality-events

>1 ContextRefreshedEvent(内置事件)

ApplicationContext容器初始化或刷新触发该事件。此处说的初始化,是指所有的bean被成功加载,后处理的bean被检测激活,所有的singleton bean被预初始化,ApplicationContext容器已就绪可用。

相关文章
|
6天前
|
前端开发 Java 测试技术
Java一分钟之Spring MVC:构建Web应用
【5月更文挑战第15天】Spring MVC是Spring框架的Web应用模块,基于MVC模式实现业务、数据和UI解耦。常见问题包括:配置DispatcherServlet、Controller映射错误、视图解析未设置、Model数据传递遗漏、异常处理未配置、依赖注入缺失和忽视单元测试。解决这些问题可提升代码质量和应用性能。注意配置`web.xml`、`@RequestMapping`、`ViewResolver`、`Model`、`@ExceptionHandler`、`@Autowired`,并编写测试用例。
293 3
|
6天前
|
Java 应用服务中间件 测试技术
深入探索Spring Boot Web应用源码及实战应用
【5月更文挑战第11天】本文将详细解析Spring Boot Web应用的源码架构,并通过一个实际案例,展示如何构建一个基于Spring Boot的Web应用。本文旨在帮助读者更好地理解Spring Boot的内部工作机制,以及如何利用这些机制优化自己的Web应用开发。
32 3
|
6天前
|
安全 Java 开发者
深入理解Spring Boot配置绑定及其实战应用
【4月更文挑战第10天】本文详细探讨了Spring Boot中配置绑定的核心概念,并结合实战示例,展示了如何在项目中有效地使用这些技术来管理和绑定配置属性。
16 1
|
6天前
|
Java 测试技术 开发者
Spring IoC容器通过依赖注入机制实现控制反转
【4月更文挑战第30天】Spring IoC容器通过依赖注入机制实现控制反转
22 0
|
6天前
|
开发框架 监控 Java
深入探索Spring Boot的监控、管理和测试功能及实战应用
【5月更文挑战第14天】Spring Boot是一个快速开发框架,提供了一系列的功能模块,包括监控、管理和测试等。本文将深入探讨Spring Boot中监控、管理和测试功能的原理与应用,并提供实际应用场景的示例。
17 2
|
6天前
|
Java Spring 容器
深入理解Spring Boot启动流程及其实战应用
【5月更文挑战第9天】本文详细解析了Spring Boot启动流程的概念和关键步骤,并结合实战示例,展示了如何在实际开发中运用这些知识。
22 2
|
6天前
|
JavaScript Java 开发者
Spring Boot中的@Lazy注解:概念及实战应用
【4月更文挑战第7天】在Spring Framework中,@Lazy注解是一个非常有用的特性,它允许开发者控制Spring容器的bean初始化时机。本文将详细介绍@Lazy注解的概念,并通过一个实际的例子展示如何在Spring Boot应用中使用它。
22 2
|
6天前
|
缓存 NoSQL Java
17:缓存机制-Java Spring
17:缓存机制-Java Spring
41 5
|
6天前
|
XML Java 数据格式
如何在Spring AOP中定义和应用通知?
【4月更文挑战第30天】如何在Spring AOP中定义和应用通知?
17 0
|
6天前
|
安全 Java 测试技术
利用Java反射机制提高Spring Boot的代码质量:概念与实战
【4月更文挑战第29天】Java反射机制提供了一种强大的方法来在运行时检查或修改类和对象的行为。在Spring Boot应用中,合理利用反射可以提高代码的灵活性和可维护性。本篇博客将探讨Java反射的核心概念,并展示如何通过反射提高Spring Boot项目的代码质量。
31 0