我似乎无法实现Spring的生命周期的实现


问题内容

在Spring的应用程序上下文加载后,我需要立即进行一些操作。据我了解,我需要创建一个Lifecycle实现,并将bean引用放入上下文中。所以我有这样的事情:

<bean id="mySpringLifecycle" class="com.my.project.MySpringLifecycle" />

该类如下所示:

public class MySpringLifecycle implements Lifecycle {

    @Override
    public void start() {
        System.out.println("The lifecycle has started.");
    }

    @Override
    public void stop() {
        return;
    }

    @Override
    public boolean isRunning() {
        return true;
    }
}

我没有收到任何错误,但MySpringLifecycle从未打印出“生命周期已开始。”,而且我的应用程序启动正常。

编辑:

这是固定的代码:

public class MySpringLifecycle implements SmartLifecycle {

    private volatile boolean isRunning = false;

    @Override
    public boolean isAutoStartup() {
        return true;
    }

    @Override
    public void stop(Runnable r) {
        System.out.println("STOPPED RUNNABLE!!!");
        isRunning = false;
    }

    @Override
    public void start() {
        System.out.println("STARTED!!!");
        isRunning = true;
    }

    @Override
    public void stop() {
        System.out.println("STOPPED!!!");
        isRunning = false;
    }

    @Override
    public boolean isRunning() {
        return isRunning;
    }

    @Override
    public int getPhase() {
        return 1;
    }
}

附带说明一下,我还想提及一个我也可以使用的替代解决方案。我的web.xml中包含以下内容:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

ContextLoaderListener上有一个名为contextInitialized的方法。因此,我所做的就是创建了自己的实现,并将其添加到了web.xml中。在我的实现中,我扩展了ContextLoaderListener,提供了contextInitialized方法的替代,该方法首先被称为super,然后执行我自己的功能。此操作仅执行一次,并且看起来运行良好。


问题答案:

有两种方法可以做到这一点:

  1. 实现SmartLifecycle的,而不是Lifecycle和确保回报trueisAutoStartup()

  2. 实施ApplicationListener<ContextRefreshedEvent>。在这种情况下,只有一种方法可以实现,而不是6种SmartLifecycle