ContextStartedEvent未在自定义侦听器

时间:2018-01-04 16:20:09

标签: java spring spring-boot

我正在尝试使用像这样的自定义应用程序监听器来创建上下文

@Component
public class ContextStartedListener implements ApplicationListener<ContextStartedEvent> {

    @Override
    public void onApplicationEvent(ContextStartedEvent event) {
        System.out.println("Context started"); // this never happens
    }
}

onApplicationEvent方法永远不会触发。如果我使用其他事件,例如ContextRefreshedEvent,那么它可以正常工作,但我需要在创建之前挂钩。有什么建议?谢谢!

1 个答案:

答案 0 :(得分:4)

<强> [编辑]

编辑答案因为downvote而添加更多信息。

您没有收到侦听器回调的原因是您没有明确调用 LifeCycle start()方法(JavaDoc)。

通常通过 ConfigurableApplicationContext 在Spring Boot案例中通过 AbstractApplicationContext 启动 ApplicationContext

下面的工作代码示例,演示回调如何工作(只是显式调用start()方法)

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.event.ContextStartedEvent;
import org.springframework.stereotype.Component;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(DemoApplication.class, args);
        applicationContext.start();
    }

    @Component
    class ContextStartedListener implements ApplicationListener<ContextStartedEvent> {

        @Override
        public void onApplicationEvent(ContextStartedEvent event) {
            System.out.println("Context started");
        }
    }
}

我在ContextRefreshedEvent回调下面建议的原因是因为在后台调用了refresh()代码。

如果您向下钻取SpringApplication#run()方法you'll eventually see it

这里再次举例说明如何使用ContextRefreshedEvent

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Component
    class ContextStartedListener implements ApplicationListener<ContextRefreshedEvent> {

        @Override
        public void onApplicationEvent(ContextRefreshedEvent event) {
            System.out.println("Context refreshed");
        }
    }
}

[编辑前]

将通用类型更改为ContextRefreshedEvent,然后它应该可以正常工作。

有关详情,请阅读this article from the Spring Blog。只是引用有关ContextRefreshedEvent

的部分
  

[..]这允许在上下文刷新时通知MyListener   并且可以使用它在应用程序时运行任意代码   语境已经完全开始。[..]