ApplicationListener事件之EmbeddedServletContainerInitializedEvent之介绍

本文介绍了如何使用Spring的ApplicationListener接口来实现启动监听器,包括获取Servlet容器启动端口及应用程序启动后的相关信息,并展示了如何配置Swagger接口文档的访问路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ApplicationListener事件

有时候需要在项目初始化的时候进行一系列工作,比如初始化一个线程池,初始化配置文件,初始化缓存等等,这时候就需要用到启动监听器,applicationListener在使用过程中可以监听某一事件的发生,可以做出相应的处理,这个方式不常用,但是在特殊情况下面还是有用的。

通过查看源代码ApplicationEvent事件

这里写图片描述

上面是Spring启动可能发布的一些事件,这里介绍我讲介绍两个事件,EmbeddedServletContainerInitializedEvent,这个事件可以用来获取到Servlet容器启动的端口

/**
 * 监听EmbeddedServletContainerInitializedEvent事件,用来获取Servlet容器初始化的端口
 *
 * @author will
 * @author qianyi
 * @author garen
 * @since 1.0
 */

@Component
public class EmbeddedServletContainerInitializedEventListener implements ApplicationListener<EmbeddedServletContainerInitializedEvent> {
    @Override
    public void onApplicationEvent(EmbeddedServletContainerInitializedEvent event) {
                            ServerPortHolder.setPort(event.getSource().getPort());
    }
}

第二个事件是图中的ApplicationReadyEvent,通常如果我们想在应用程序启动之后获取一些启动信息,可以监听这个事件,然后完成一系列的事件,比如获取启动的ContextPath
,这里因为项目中集成了Swagger接口文档,在应用程序启动完成之后,我们可以打印出Swagger文档的访问路径

/**
 * 应用程序启动监听,准备Swagger接口文档
 *
 * @author will
 * @author qianyi
 * @author garen
 * @since 1.0
 */
@Component
public class ApplicationReadyListener implements ApplicationListener<ApplicationReadyEvent> {

    public static final Logger LOGGER = LoggerFactory.getLogger(ApplicationReadyListener.class);
    @Autowired
    private ServerProperties properties;

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {

        LOGGER.debug("Application Ready");
        String ctx = properties.getContextPath();
        if (StringUtils.isEmpty(ctx)) {
            ctx = "/";
        } else {
            ctx = ctx + "/";
        }

        String portPart = "";
        Integer port = ServerPortHolder.getPort();
        if (port!=80) {
            portPart = ":" + port;
        }
        String host = null;
        try {
            host = InetAddress.getLocalHost().getHostAddress();
        } catch (UnknownHostException e) {
            // e.printStackTrace();
        }
        if (StringUtils.isEmpty(host)) {
            host = "127.0.0.1";
        }
        String message = String.format("Access URLS: External: %s%s%s%s%s", "http://", host, portPart, ctx, "swagger-ui.html");
         message+= String.format(" , %s%s%s%s%s", "http://", host, portPart, ctx, "");
        LOGGER.info(message);
    }
}

这里我们可以看到,启动之后,我们的Console会打印出我们的访问地址:
这里写图片描述

<think>好的,我现在需要详细回答用户关于Spring ApplicationListener的问题。首先,我要确保自己正确理解这个接口的作用和用法。ApplicationListenerSpring框架中的一个事件监听接口,基于观察者模式,用于处理应用程序事件。用户可能需要了解如何实现它,以及在实际项目中的使用场景。 首先,我需要回顾ApplicationListener的基本定义。它位于org.springframework.context包中,是一个泛型接口,需要实现onApplicationEvent方法。当特定类型的事件发布时,监听器会被触发。例如,Spring内置了一些事件,如ContextRefreshedEvent、ContextStartedEvent等,用户也可以自定义事件。 接下来,用户可能想知道如何实现一个ApplicationListener。根据引用中的例子,比如引用[2]和引用[3],实现步骤包括创建一个类实现ApplicationListener接口,指定事件类型,并重写onApplicationEvent方法。然后,需要将监听器注册到Spring容器中,可以通过@Component注解或XML配置。 然后,使用场景部分需要详细说明。引用[4]提到可以监听原生事件如RequestHandledEvent,或者自定义事件。常见的应用包括初始化操作、资源释放、日志记录等。例如,在应用启动完成后进行一些数据加载,或者在请求处理完成后记录日志。 另外,需要比较ApplicationListener与其他类似接口,比如ApplicationRunner或CommandLineRunner。根据引用[1],ApplicationListener更灵活,属于Spring Context,而SpringApplicationRunListener属于Spring Boot,可能更底层。需要指出ApplicationListener的适用性和优势。 还要注意提到一些高级用法,比如使用@EventListener注解替代实现接口的方式,这在Spring 4.2之后支持,使代码更简洁。同时,需要强调监听器的执行顺序和异步处理的可能性,但用户可能需要自行配置异步支持。 最后,确保回答结构清晰,分点说明,并引用提供的参考资料。例如,在实现步骤部分引用[2]和[3],在应用场景部分引用[4]。同时,生成的相关问题要围绕可能延伸的内容,比如与ApplicationRunner的区别、自定义事件的方法、执行顺序控制等。</think>### Spring ApplicationListener 详细介绍及使用场景 #### 一、基本定义与核心机制 $ApplicationListener$ 是 Spring 框架中基于**观察者模式**的事件监听接口,用于接收并处理应用程序事件。它属于 `org.springframework.context` 包,通过实现 `onApplicationEvent` 方法响应特定类型的事件[^3]。例如: ```java public interface ApplicationListener<E extends ApplicationEvent> extends EventListener { void onApplicationEvent(E event); } ``` #### 二、实现步骤 1. **定义监听器类**:实现 `ApplicationListener` 接口,并指定监听的事件类型(如内置事件或自定义事件)。 ```java @Component public class CustomListener implements ApplicationListener<ContextRefreshedEvent> { @Override public void onApplicationEvent(ContextRefreshedEvent event) { // 处理逻辑 } } ``` 引用示例见[^2][^4]。 2. **注册监听器**: - 使用 `@Component` 注解自动扫描注册; - 或通过 XML 配置 `<bean class="com.example.CustomListener"/>`。 #### 三、内置事件类型 1. **ContextRefreshedEvent**:容器刷新完成时触发(如应用启动完成)[^3]; 2. **RequestHandledEvent**:HTTP 请求处理完成后触发,可获取请求路径、响应时间等信息[^4]; 3. **ContextClosedEvent**:容器关闭时触发,用于资源释放。 #### 四、使用场景 1. **初始化操作**:监听 `ContextRefreshedEvent` 执行数据预加载或配置检查; ```java public void onApplicationEvent(ContextRefreshedEvent event) { if (event.getApplicationContext().getParent() == null) { // 根容器初始化完成时执行 } } ``` 2. **请求监控**:通过 `RequestHandledEvent` 记录请求耗时或异常信息; 3. **自定义事件**:扩展 `ApplicationEvent` 实现业务解耦,例如订单创建后触发通知: ```java public class OrderCreatedEvent extends ApplicationEvent { public OrderCreatedEvent(Order order) { super(order); } } ``` 发布事件: ```java applicationContext.publishEvent(new OrderCreatedEvent(order)); ``` #### 五、与其他接口对比 - **ApplicationRunner**:在 Spring Boot 启动后执行,仅触发一次,适用于命令行参数处理; - **ApplicationListener**:更通用,支持多种事件类型和多次触发[^1]。 #### 六、高级用法 1. **条件过滤**:通过 `@EventListener` 注解结合 SpEL 表达式选择特定事件; ```java @EventListener(condition = "#event.success") public void handleRequest(RequestHandledEvent event) { // 仅处理成功请求 } ``` 2. **异步处理**:结合 `@Async` 实现异步事件处理(需启用异步支持)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值