背景
- requestMappingHandlerMapping: defined by method ‘requestMappingHandlerMapping’ in class path resource [com/works/framework/config/WebMvcConfig.class]
- controllerEndpointHandlerMapping: defined by method ‘controllerEndpointHandlerMapping’ in class path resource [org/springframework/boot/actuate/autoconfigure/endpoint/web/servlet/WebMvcEndpointManagementContextConfiguration.class]
意外发现
-
我找到创建requestMappingHandlerMapping
的地方是WebMvcAutoConfiguration
。这块是Spring Boot自动装配的代码。
-
我想requestMappingHandlerMapping
框架自动配置了,那异步可以自动配置吗?
-
于是我搜索关键字configureAsyncSupport
,还真的有自动配置异步的方法。如下图所示。
-
只要有Bean的名称是TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME
并且是属于AsyncTaskExecutor
的对象,那就能自动配置异步处理的线程池了。
-
另外,TaskExecutionAutoConfiguration
是自动配置线程池的配置类。
-
只要有对应的配置,就可以初始化线程池和异步,可以看出Spring Boot
在约定配置这块很智能。
结论
...省略...
@Bean(name = {"threadPoolTaskExecutor",TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME})
public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setMaxPoolSize(maxPoolSize);
executor.setCorePoolSize(corePoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setKeepAliveSeconds(keepAliveSeconds);
// 线程池对拒绝任务(无线程可用)的处理策略 ,CallerRunsPolicy 如果没有线程了,用主线程
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setThreadNamePrefix("taskExecutor-");
return executor;
}
...省略...