我有SpringBoot应用程序,该应用程序加载了一些配置并以@PostConstract注释的方法运行了长时间的处理。如果应用程序成功完成或出现错误,应释放一些资源。
问题是如何最正确地释放应用程序资源?是否足以在@PreDestroy带注释的方法中实现它,或者我也应该在@PostConstract带注释的方法中捕获异常。
@SpringBootApplication
@Import(MyConfiguration.class)
public class MySpringApplication {
@Autowire
ProcessRunner processRunner;
@Autowire
ResourceBean resourceBean;
public static void main(String[] args) {
SpringApplication.run(MySpringApplication.class, args);
}
@PostConstruct
void postConstruct {
try {
processRunner.run()
} catch (Exception ex) {
// Do we really need this Exception handling to release resource?
resourceBean.release();
}
}
@PreDestroy
void preDestroy() {
resourceBean.release();
}
}
最佳答案
预销毁
当上下文释放bean时用作回调(即:在上下文关闭时)。这意味着PreDestroy不与PostConstruct耦合。如果Bean存在于上下文中并被释放,则将调用predestroy。
后构造
旨在初始化bean。如果引发异常,则应用程序将无法启动。
所以,回答您的问题...
如果在事后合同中出现异常,是否可以授予predestroy-method-call?
PreDestroy和PostConstruct不耦合。这意味着,如果PostConstruct遇到异常但以某种方式进行了管理并且该方法成功结束,则将初始化Bean,并在上下文中将其可用。当时间到了并且上下文关闭时,将释放Bean并调用PreDestroy。
如果PostConstruct抛出异常,则Bean将在上下文中不可用(并且该应用程序将无法启动),因此不会调用PreDestroy。
问题是如何最正确地释放应用程序资源?这足以在@PreDestroy带注释的方法中使它生效,还是我也应该在@PostConstract带注释的方法中捕获异常?
您应该捕获异常并释放所有非托管资源。这也适用于JEE,JEE指定作为最佳实践,必须以编程方式处理在上下文之外获取的资源。