@ PostConstruct和@PreDestroy注释的实时应用使用

问题描述 投票:0回答:2

而且在spring-boot应用程序中,我们也不在任何地方关闭上下文,因此Web应用程序如何管理此关闭上下文并破坏bean的工作。

实际上该Web应用程序将触发上下文关闭并触发@PreDestroy注释。

java spring spring-boot spring-mvc servlets
2个回答
0
投票

@@@@@@@@@@@@@@@如果<< @@@@@@的@@@ [c,c.c.t.,c)可以在初始化所有bean之后执行任何操作。我有以下用例,其中使用了@PostConstruct

我有11个customerProcess类的实现,每次操作后,我必须调用一个不同的进程,因此我们需要自动装配所有实现,而我们使用postconstruct来获取一个枚举映射,并向其提供类名,并得到相应的名称。豆,所以Post Construct在这里为我工作

 @PostConstruct
  private void init() {
    CustomerProcessTask.getClassList().forEach( aClass -> {
      final CustomerTask customerTypeBean = applicationContext.getBean(aClass);
      factory.put(aClass,customerTypeBean);
    });
  }

@@ PreDestroy有多种用例,当需要在调用applicationContext.close之前关闭打开的数据库连接或回滚某些内容时,可以使用它。但是对于Web应用程序,dispatcherServlet创建applicationContext,并在服务器停止时关闭上下文。我们不需要显式调用applicationContext.close()。

@PreDestroy()
public void dataSourceDestroy() throws SQLException {
    rollbackUnCommittedTransaction();
    }
}

0
投票

取决于bean的范围。

对于请求范围的bean,在完成处理HTTP请求时将调用它。

对于会话范围的bean,当会话被销毁时(例如,由于不活动而超时)被调用。

对于原型bean,将不会调用它,并且调用销毁逻辑是开发人员的责任。 (在this section的文档中提到)。

对于单例bean,当您正常终止应用程序时(即通过发送SIGTERM信号,例如kill 12345,其中12345是您的应用程序进程ID),将调用该函数。请注意,如果您使用kill -9 12345

“强行杀死”应用程序,则不会调用它
© www.soinside.com 2019 - 2024. All rights reserved.