首页 > 解决方案 > 如何在 TaskExecutionAutoConfiguration 旁边创建额外的 TaskExecutor?

问题描述

我希望 springThreadPoolTaskExecutorTaskExecutionAutoConfiguration. 虽然我想为一些明确的副任务提供可能拥有额外的执行者:

@Bean
public ThreadPoolExecutor myRequestPool() {
    return (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
}

问题:加上上面的bean,TaskExecutionAutoConfiguration就不会再执行了,spring-default执行器也不会被初始化,因为@ConditionalOnMissingBean(Executor.class)不匹配了:

package org.springframework.boot.autoconfigure.task;

public class TaskExecutionAutoConfiguration {

    @Lazy
    @Bean(name = APPLICATION_TASK_EXECUTOR_BEAN_NAME)
    @ConditionalOnMissingBean(Executor.class)
    public ThreadPoolTaskExecutor applicationTaskExecutor(TaskExecutorBuilder builder) {
        return builder.build();
    }

问题:我怎样才能让 spring 创建两个 bean?

标签: javaspringspring-boot

解决方案


只有在处理自动配置时(由于)不存在其他执行器bean 时,TaskExecutionAutoConfiguration才会创建执行器 bean 。@ConditionalOnMissingBean(Executor.class)所以,为了创建我们的执行器和定义的执行TaskExecutionAutoConfiguration器,我们需要确保我们的bean在之后被处理。TaskExecutionAutoConfiguration

根据docs,如果我们让我们的 bean 成为自动配置候选者(这需要@Configuration在 中添加类META-INF/spring.factories),那么我们可以使用@AutoConfigureAfter它来配置它以在之后处理TaskExecutionAutoConfiguration

package foo.bar.baz.qux;

@Configuration
@AutoConfigureAfter(TaskExecutionAutoConfiguration.class)
public class Config {
    @Bean
    public ThreadPoolExecutor myRequestPool() {
        return (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
    }
}

然后创建META-INF/spring.factories包含:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  foo.bar.baz.qux.Config

推荐阅读