【问题标题】:Real time applcation use of @PostConstruct and @PreDestroy annotation@PostConstruct 和@PreDestroy 注解的实时应用使用
【发布时间】:2020-04-01 04:23:44
【问题描述】:

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

当这个web应用实际上会触发上下文的关闭并触发@PreDestroy注解。

【问题讨论】:

  • 在 web 应用程序中,如果组件具有“请求”范围,@PreDestroy 将在 web 请求完成时被调用。有很多场景。阅读文档。尝试一下。
  • 请提供minimal reproducible example 并描述您需要这些注释(上下文启动/关闭修改)的位置。

标签: java spring spring-boot spring-mvc servlets


【解决方案1】:

这取决于 bean 的范围。

对于请求作用域的bean,它在处理完一个HTTP请求时被调用。

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

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

对于单例 bean,它在您正常终止应用程序时调用(即通过发送 SIGTERM 信号,例如 kill 12345,其中 12345 是您的应用程序进程 ID)。请注意,如果您使用kill -9 12345“硬杀”应用程序,则不会调用它

【讨论】:

    【解决方案2】:

    @PostConstruct 如果您想在所有 bean 都初始化后做任何事情,它会非常有用。我有以下使用过@PostConstruct的用例

    我有 11 个 customerProcess 类的实现,每次操作后,我必须调用一个不同的进程,所以我们需要自动装配它的所有实现,而不是我们使用 postconstruct 来获取我们提供类名的枚举映射,然后我们得到了相应的 bean,所以 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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-24
      相关资源
      最近更新 更多