## 先说结论:因为Spring帮你调用了这个方法 首先我们把这玩意单独拿出来用 public class SomeTest { public static void main(String[] args) { ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); threadPoolTaskExecutor.submit(() -> System.out.println("!")); } } 这里就会报错,`ThreadPoolTaskExecutor not initialized` 然后我们换一个姿势,就没有问题了 @SpringBootApplication public class DemoApplication { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(Demo21Application.class, args); ThreadPoolTaskExecutor myExecutor = context.getBean("myExecutor", ThreadPoolTaskExecutor.class); myExecutor.submit(() -> System.out.println("hello!")); } @Bean public ThreadPoolTaskExecutor myExecutor() { return new ThreadPoolTaskExecutor(); } } 那么spring是怎么调用到这个方法呢,让我们打开 `ExecutorConfigurationSupport` @Override public void afterPropertiesSet() { initialize(); } 然后这个方法是在 `InitializingBean` 里定义的,熟悉 Spring Bean 生命周期的朋友们应该已经知道这是怎么回事了,简单说就是对bean的初始化完成之后进行的其他初始化工作