我似乎无法实现Spring的Lifecycle工作

时间:2011-06-06 22:32:12

标签: spring spring-mvc

在加载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,然后执行了我自己的功能。这只执行一次,看起来效果很好。

4 个答案:

答案 0 :(得分:9)

两种方法:

  1. 实施SmartLifecycle而不是Lifecycle,并确保从true返回isAutoStartup()

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

答案 1 :(得分:1)

如果您修改MySpringLifecycle以实施SmartLifecycle而不是Lifecycle,则代码段中的System.outs将按照您的预期打印出来。

答案 2 :(得分:0)

我不确定,但除了一个或多个LifecycleProcessor个对象之外,您might还需要Lifecycle

答案 3 :(得分:0)

根据你在加载Spring的应用程序上下文后的意思,取决于你的意思。,InitializingBean的实现可能正是你要找的。 LifeCycle可能太低级了。