Spring:在启动和停止Web应用程序时更新DB表条目

时间:2014-01-08 18:47:04

标签: java spring

我必须在启动和停止应用程序时更新表条目。 我有一个调用DAO方法的服务但是当调用这个DAO方法时,自动装配的SessionFactory为空。

我使用了两种方法:

  1. @PostConstruct,@ PreDestroy
  2. ApplicationListener onApplicationEvent()
  3. 在这两种情况下,我在DAO类中将SessionFactory视为null。我在DAO类中使用Setter-Injection来注入SessionFactory

    环境:JDBC-Datasource,Hibernate 3.4,Spring 3.1.2,Weblogic 10.3

    如果你能指出我正确的方向,那就太好了。

    更新: 感谢您的所有评论,我得到了解决。我们的应用程序是一个EAR,我的DAO bean配置位于不同的WAR的applicationContext.xml中。我将DAO bean配置移动到我的共享配置(appConfig.xml),它就像魅力一样。我使用了@PostConstruct和@PreDestroy

2 个答案:

答案 0 :(得分:1)

您可以使用SmartLifecycle接口进行配置,然后将其配置为bean:

<bean class="com.my.package.MySmartlifecycle">

您的实施:

public class MySmartLifecycle implements SmartLifecycle{
    //autowire anything you need from context
    @Override
    public void start() {
        //do stuff on startup here
    }

    @Override
    public void stop() {
        //do stuff on shutdown here
    }

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

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

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

    @Override
    public void stop(Runnable callback) {

    }

}

答案 1 :(得分:0)

如果要在初始化上下文后执行方法,则必须使用ContextRefreshedEvent。在上下文销毁的情况下,您应该使用ContextStoppedEvent,但您还必须记住,不能保证将发布此事件。

@Component
public class SpringStartedListener implements ApplicationListener<ContextRefreshedEvent> {

  @Override
  public void onApplicationEvent(ContextRefreshedEvent event) {
    // do something
  }
}

@Component
public class SpringClosedListener implements ApplicationListener<ContextStoppedEvent> {

  @Override
  public void onApplicationEvent(ContextStoppedEvent event) {
    // do something
  }
}

如果您需要更多详情,请参阅http://www.tutorialspoint.com/spring/event_handling_in_spring.htm