在加载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,然后执行了我自己的功能。这只执行一次,看起来效果很好。
答案 0 :(得分:9)
两种方法:
实施SmartLifecycle
而不是Lifecycle
,并确保从true
返回isAutoStartup()
。
实施ApplicationListener<ContextRefreshedEvent>
。在这种情况下,只有一种方法可以实现,而不是SmartLifecycle
的6。
答案 1 :(得分:1)
如果您修改MySpringLifecycle
以实施SmartLifecycle而不是Lifecycle,则代码段中的System.outs将按照您的预期打印出来。
答案 2 :(得分:0)
我不确定,但除了一个或多个LifecycleProcessor
个对象之外,您might还需要Lifecycle
。
答案 3 :(得分:0)
根据你在加载Spring的应用程序上下文后的意思,取决于你的意思。,InitializingBean的实现可能正是你要找的。 LifeCycle可能太低级了。