如何调用SpringApplicationRunListener中的函数

632*_*324 1 spring spring-boot

我有一个像这样的SpringApplicationRunListener实现。

public class AppListener implements SpringApplicationRunListener {
    private long appStartTimestamp;
    private long appFinishTimestamp;

    public AppListener(SpringApplication application, String[] args) {
    }

    @Override
    public void started() {
        appStartTimestamp = System.currentTimeMillis();
    }

    @Override
    public void environmentPrepared(ConfigurableEnvironment environment) {
        //Not used.
    }

    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
        //Not used.
    }

    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
        //Not used.
    }

    @Override
    public void finished(ConfigurableApplicationContext context, Throwable exception) {
        appFinishTimestamp = System.currentTimeMillis();
    }

    public long getAppStartTimestamp() {
        return appStartTimestamp;
    }

    public long getAppFinishTimestamp() {
        return appFinishTimestamp;
    }
}
Run Code Online (Sandbox Code Playgroud)

在不使用任何静态方法或变量的情况下,如何调用getAppStartTimestamp()andgetAppFinishTimestamp()函数来获取这两个变量?下面的代码不起作用,因为我初始化了AppListener.

AppListener appListener = new AppListener(new SpringApplicationBuilder(Application.class).build(), null);
appStartTimestamp = appListener.getAppStartTimestamp(); // 0
appFinishTimestamp = appListener.getAppFinishTimestamp(); // 0
Run Code Online (Sandbox Code Playgroud)

我发现它AppListener不能作为一个bean,因为它是在Spring开始bean管理之前调用的。有没有办法让运行AppListener实例调用这两个get函数?谢谢。

Avi*_*ash 7

创建 POJO 来保存应用程序事件数据

@Component
public class AppEventData {

    private long appStartTimestamp;
    private long appFinishTimestamp;

    public long getAppStartTimestamp() {
        return appStartTimestamp;
    }

    public void setAppStartTimestamp(long appStartTimestamp) {
        this.appStartTimestamp = appStartTimestamp;
    }

    public long getAppFinishTimestamp() {
        return appFinishTimestamp;
    }

    public void setAppFinishTimestamp(long appFinishTimestamp) {
        this.appFinishTimestamp = appFinishTimestamp;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在更新侦听器类的完成方法,将开始时间和结束时间的值放入 POJO 中

public class AppListener implements SpringApplicationRunListener {
    private long appStartTimestamp;
    private long appFinishTimestamp;

    public AppListener(SpringApplication application, String[] args) {
        super();
    }

    @Override
    public void started() {
        appStartTimestamp = System.currentTimeMillis();
    }

    @Override
    public void environmentPrepared(ConfigurableEnvironment environment) {
        //Not used.
    }

    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
        //Not used.
    }

    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
        //Not used.
    }

    @Override
    public void finished(ConfigurableApplicationContext context, Throwable exception) {
        appFinishTimestamp = System.currentTimeMillis();
        AppEventData data = context.getBean(AppEventData.class);
        data.setAppStartTimestamp(appStartTimestamp);
        data.setAppFinishTimestamp(appFinishTimestamp);
    }

    public long getAppStartTimestamp() {
        return appStartTimestamp;
    }

    public long getAppFinishTimestamp() {
        return appFinishTimestamp;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以从任何地方从 POJO 获取数据,例如我向您展示 main 方法。

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);

        AppEventData data = ctx.getBean(AppEventData.class);
        System.out.println(data.getAppStartTimestamp());
        System.out.println(data.getAppFinishTimestamp());
    }
}
Run Code Online (Sandbox Code Playgroud)

完成....

不要忘记将侦听器放入src/main/resources/META-INF/spring.factories如下所示,否则侦听器将不会运行。

org.springframework.boot.SpringApplicationRunListener=com.app.AppListener
Run Code Online (Sandbox Code Playgroud)