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

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("启动时作出如下动作!"));
    }
}

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值