【发布时间】:2011-06-06 22:32:12
【问题描述】:
我需要在 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,然后执行我自己的功能。这只会执行一次,并且似乎运行良好。
【问题讨论】:
-
引用自static.springsource.org/spring/docs/3.0.x/reference/… 可以看到SmartLifecycle 定义的stop 方法接受回调。任何实现都必须在该实现的关闭过程完成后调用该回调的 run() 方法。
-
如果你的类另外扩展了另一个类怎么办。此外,提到的类在 spring
中定义。如何在您的类示例中实例化这些参数?
标签: spring spring-mvc