SpringBoot中ApplicationListener事件监听的6种方式

本文详细介绍了如何在Spring Boot应用中通过不同方式添加监听器,包括通过`ApplicationListener`接口、组件注解、配置文件、`@EventListener`、`spring.factories`和编程式初始化。重点演示了如何在ApplicationContext中注册并监听TestEvent事件。

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

Event事件:

import org.springframework.context.ApplicationEvent;

public class TestEvent extends ApplicationEvent {
    public TestEvent(Object source) {
        super(source);
    }
}

一、向ApplicationContext中添加监听器

public class TestListener1 implements ApplicationListener<TestEvent> {
    Logger logger = LoggerFactory.getLogger(TestListener1.class);

    @Override
    public void onApplicationEvent(TestEvent event) {
        logger.info(String.format("%s  监听到事件源:%s.", TestListener1.class.getName(), event.getSource()));
    }
}

要点是spring上下文中加入监听器

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);
        //装载监听
        context.addApplicationListener(new TestListener1());
        context.publishEvent(new TestEvent("启动时作出如下动作!"));
    }
}

二、将监听器作为组件交给spring容器管理

要点:@Component声明

@Component
public class TestListener2 implements ApplicationListener<TestEvent> {
    Logger logger = LoggerFactory.getLogger(TestListener2.class);

    @Override
    public void onApplicationEvent(TestEvent event) {
        logger.info(String.format("%s  监听到事件源:%s.", TestListener2.class.getName(), event.getSource()));

    }
}
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);
        context.publishEvent(new TestEvent("启动时作出如下动作!"));
}

三、在application.properties中配置监听器context.listener.classes

public class TestListener3 implements ApplicationListener<TestEvent> {
    Logger logger = LoggerFactory.getLogger(TestListener3.class);

    @Override
    public void onApplicationEvent(TestEvent event) {
        logger.info(String.format("%s  监听到事件源:%s.", TestListener3.class.getName(), event.getSource()));

    }
}
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);
        context.publishEvent(new TestEvent("启动时作出如下动作!"));
}

这种方式有个问题:测试时监听器会执行2遍。

四、通过@EventListener注解实现事件监听

@Component
public class TestListener4 {
    Logger logger = LoggerFactory.getLogger(TestListener4.class);

    @EventListener
    public void onApplicationEvent(TestEvent event) {
        logger.info(String.format("%s  监听到事件源:%s.", TestListener4.class.getName(), event.getSource()));

    }
}
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);
        context.publishEvent(new TestEvent("启动时作出如下动作!"));
}

五、配置spring.factories

public class TestListener5 implements ApplicationListener<TestEvent> {
    Logger logger = LoggerFactory.getLogger(TestListener5.class);

    @Override
    public void onApplicationEvent(TestEvent event) {
        logger.info(String.format("%s  监听到事件源:%s.", TestListener5.class.getName(), event.getSource()));
    }
}

在这里插入图片描述

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);
        context.publishEvent(new TestEvent("启动时作出如下动作!"));
}

六、通过实现接口org.springframework.context.ApplicationContextInitializer,得到context后通过编程式,设置监听器

public class TestListener6 implements ApplicationListener<TestEvent> , ApplicationContextInitializer {
    Logger logger = LoggerFactory.getLogger(TestListener6.class);

    @Override
    public void onApplicationEvent(TestEvent event) {
        logger.info(String.format("%s  监听到事件源:%s.", TestListener6.class.getName(), event.getSource()));
    }

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        applicationContext.addApplicationListener(new TestListener6());
    }
}
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(Application.class);
        springApplication.addInitializers(new TestListener6());
        ConfigurableApplicationContext context = springApplication.run(args);
        //发布事件
        context.publishEvent(new TestEvent("启动时作出如下动作!"));
    }

}

七、测试运行结果

统一运行:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(Application.class);
        springApplication.addInitializers(new TestListener6());
        ConfigurableApplicationContext context = springApplication.run(args);
        //装载监听
        context.addApplicationListener(new TestListener1());
        //发布事件
        context.publishEvent(new TestEvent("启动时作出如下动作!"));
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值