Spring的AppilcaitionContext发布事件和监听事件,最新

1.ApplicationContext实现了ApplicationEventPublisher接口,是能发布事件的必要条件
2.ApplicationContextEvent 类继承了ApplicationEvent类(非必要条件);

package com.dj;

import lombok.*;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.web.bind.annotation.RestController;

import java.io.Serializable;

/**
 * @Author: ldj
 * @Date: 2021/12/17/18:28
 * @Description:
 */
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@RestController
@Slf4j
public class PublishEventDemo {
    /**
     * 使用ApplicationContext发布事件
     */
    @Autowired
    ApplicationContext applicationContext;

    @Test
    public void sendData() {
        //1.构造事件类信息,加@Builder才可以这样
        UserDTO userDTO = UserDTO.builder()
                .name("ldj")
                .age(18)
                .sex("男")
                .build();

        //2.开始发布事件
        applicationContext.publishEvent(userDTO);
    }
}

/**
 * 事件类
 * 1.不实现序列化也不会报错!!!!
 * 2.如果不加@Data 监听到信息:com.dj.UserDTO@b7d2d51
 */
@Data 
@Builder
class UserDTO implements Serializable{
    private String name;
    private Integer age;
    private String sex;

}

/**
 * 监听器类
 */
@Slf4j
@Component
class MyEventListener{

    @Asysc //可以选择异步执行(特别适合日志记录,别忘了在启动类加上@EnableAsync)
    @EventListener //监听注解 可省略了(MyEventListener implements ApplicationListener<UserDTO>)
    public void listen(UserDTO userDTO) {
        log.info("MyEventListener监听到信息:{}", userDTO);
    }
}

 测试结果

 回过头说开头第2条说明,网上大多数帖子将 事件类继承ApplicationEvent,其实并不是硬性条件,为什么?当你点进去看源码,就豁然开朗了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring容器中,可以通过监听事件来实现在容器启动和关闭时执行相应的操作。引用提到了Spring容器启动和关闭时的事件监听。引用和引用则提到了Spring Boot对Spring容器事件的扩展。 在Spring中,一些常见的容器监听事件包括: 1. ContextRefreshedEvent:当Spring容器刷新完成后触发的事件,表示容器已经初始化完毕。 2. ContextStartedEvent:当Spring容器开始启动时触发的事件。 3. ContextStoppedEvent:当Spring容器停止时触发的事件。 4. ContextClosedEvent:当Spring容器关闭时触发的事件,表示整个容器销毁。 而Spring Boot对Spring容器事件的扩展包括: 1. ApplicationEnvironmentPreparedEvent:容器环境对象初始化后的事件。 2. ApplicationPreparedEvent:容器初始化前的事件,在执行refresh动作之前触发。 3. ApplicationStartedEvent:容器已经完成refresh动作后触发的事件。 4. ApplicationReadyEvent:容器已经完全启动并处于运行中的事件。 5. ApplicationFailedEvent:容器初始化失败时触发的事件。 6. ApplicationStartingEvent:容器开始启动时触发的事件。 通过监听这些事件,我们可以在不同的阶段执行自定义的逻辑或操作,以满足特定的需求。例如,在ContextRefreshedEvent事件中,可以实现一些初始化操作;在ContextClosedEvent事件中,可以执行资源释放的操作。引用提到了一个简单应用,通过监听ContextRefreshEvent事件,在容器刷新完成后开始Dubbo服务暴露的过程。 综上所述,Spring容器提供了多种监听事件,而Spring Boot对其进行了扩展,通过监听不同的事件可以在容器的不同生命周期阶段执行相应的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值