我注意到@PreDestroy我的原型范围Spring bean 的钩子没有被执行.
我在这里读到这实际上是设计的.Spring容器将销毁单例bean,但不会销毁原型bean.我不清楚为什么.如果Spring容器将创建我的原型bean并执行它的@PostConstruct钩子,为什么在容器关闭时它也不会破坏我的bean?一旦我的Spring容器关闭,继续使用它的任何bean都有意义吗?我看不到你想要在完成bean之前关闭容器的场景.甚至可以在容器关闭后继续使用原型Spring bean吗?
上面描述了我的主要问题的令人费解的背景:如果Spring容器没有破坏原型bean,那是否意味着可能发生内存泄漏?或者原型bean会在某些时候被垃圾收集?
春季文件指出:
客户端代码必须清理原型范围的对象并释放原型bean所持有的昂贵资源.要使Spring容器释放原型范围的bean所拥有的资源,请尝试使用自定义bean后处理器,它包含对需要清理的bean的引用.
那是什么意思?该文本告诉我,我作为程序员负责明确(手动)销毁我的原型bean.它是否正确?如果是这样,我该怎么做?
我有一个 Spring @Configuration 类,如下所示:
@Configuration
public class ExecutorServiceConfiguration {
@Bean
public BlockingQueue<Runnable> queue() {
return ArrayBlockingQueue<>(1000);
}
@Bean
public ExecutorService executor(BlockingQueue<Runnable> queue) {
return ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, queue);
}
@PreDestroy
public void shutdownExecutor() {
// no executor instance
}
}
Run Code Online (Sandbox Code Playgroud)
我还想指定一种@PreDestroy关闭 ExecutorService 的方法。但是,该@PreDestroy方法不能有任何参数,这就是为什么我无法将executorbean 传递给该方法以关闭它的原因。指定 destroy 方法也@Bean(destroyMethod = "...")不起作用。它允许我指定现有的shutdownor shutdownNow,但不能指定我打算使用的自定义方法。
我知道我可以直接实例化队列和执行器,而不是作为 Spring bean,但我宁愿这样做。