而且在spring-boot应用程序中,我们也不在任何地方关闭上下文,因此Web应用程序如何管理此关闭上下文并破坏bean的工作。
实际上该Web应用程序将触发上下文关闭并触发@PreDestroy注释。
@@@@@@@@@@@@@@@如果<< @@@@@@的@@@ [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();
}
}
取决于bean的范围。
对于请求范围的bean,在完成处理HTTP请求时将调用它。
对于会话范围的bean,当会话被销毁时(例如,由于不活动而超时)被调用。
对于原型bean,将不会调用它,并且调用销毁逻辑是开发人员的责任。 (在this section的文档中提到)。
对于单例bean,当您正常终止应用程序时(即通过发送SIGTERM信号,例如kill 12345
,其中12345是您的应用程序进程ID),将调用该函数。请注意,如果您使用kill -9 12345