Spring 4中@Bean创建的Executor销毁疑问:能否识别DisposableBean?
关于Spring 4中自定义Executor销毁逻辑的疑问解答
好问题!我来给你拆解一下这个问题:
首先明确结论:Spring会识别到你定义的这个ThreadPoolTaskExecutor是DisposableBean的实例,并自动执行它的销毁操作。
具体原因如下:
ThreadPoolTaskExecutor的接口实现ThreadPoolTaskExecutor类本身就实现了DisposableBean接口,并且重写了destroy()方法——这个方法里封装了线程池的关闭逻辑,会优雅地终止线程池(比如等待正在执行的任务完成、处理队列中的剩余任务等)。Spring容器的销毁机制
Spring容器在销毁单例Bean时,会自动检查Bean是否符合以下任意一种销毁触发条件:- 实现了
DisposableBean接口 - 带有
@PreDestroy注解的方法 - 在
@Bean注解中指定了destroyMethod属性
你的replicationThreadExecutor是通过@Bean定义的默认单例Bean,完全符合第一个条件,所以容器关闭时会自动调用它的destroy()方法。
- 实现了
关于你手动调用
initialize()的小补充
顺便提一句:ThreadPoolTaskExecutor还实现了InitializingBean接口,Spring在初始化这个Bean时会自动调用它的afterPropertiesSet()方法,而这个方法内部已经包含了initialize()的逻辑。所以你代码里手动调用executor.initialize()其实是多余的,不过这不会影响后续的销毁逻辑。
内容的提问来源于stack exchange,提问作者rd31415
相关产品推荐
相关产品推荐

