You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot多实例MyExecutor Bean注入失败问题求助

问题描述

我使用Kotlin编写了一个Spring Boot 2.5.x应用,初始代码如下:

@Component
class MyExecutor<INPUT_TYPE,OUTPUT_TYPE>(@Value("xyz") val myVar: String){
    fun execute(input: INPUT_TYPE): OUTPUT_TYPE {// 具体实现}
}

需要该Bean的两个实例:一个使用默认myVar值"xyz",另一个使用指定值"abc",因此定义了配置类:

@Configuration
class AppConfig{
   
  @Bean
  fun customExecutor(){
     return MyExecutor<TypeA,TypeB>("abc")
  }
}

之后在两个服务中注入不同实例:

@Service
class ServiceA(
   @Qualifier("customExecutor") val customExecutor: MyExecutor<TypeA,TypeB>
){ ... }
@Service
class ServiceB(
   val executor: MyExecutor<TypeC,TypeD>
){ ... }

运行应用时出现启动失败异常:

***************************
APPLICATION FAILED TO START
***************************

Description:

Field customExecutor in pkg.ServiceA required a bean of type 'pkg.MyExecutor' that could not be found.


Action:

Consider defining a bean of type 'pkg.MyExecutor' in your configuration.

移除@Qualifier注解后应用可启动,但ServiceA注入的是默认myVar为"xyz"的MyExecutor,而非指定的"abc"实例。

需求是:ServiceA注入myVar为"xyz"的实例,ServiceB注入myVar为"abc"的实例,该如何实现?

编辑尝试:
移除MyExecutor上的@Component注解后,代码调整为:

class MyExecutor<INPUT_TYPE,OUTPUT_TYPE>(val myVar: String){
    fun execute(input: INPUT_TYPE): OUTPUT_TYPE {// 具体实现}
}
@Configuration 
class AppConfig{       
   @Bean("customExecutor")   
   fun customExecutor(){      
      return MyExecutor<TypeA,TypeB>("abc")   
   }         

   @Bean("defaultExecutor")   
   fun defaultExecutor(){      
      return MyExecutor<TypeC,TypeD>("xyz")   
   }  
}
@Service
class ServiceA(
   @Qualifier("customExecutor") val customExecutor: MyExecutor<TypeA,TypeB>
){ ... }
@Service
class ServiceB(
   @Qualifier("defaultExecutor") val executor: MyExecutor<TypeC,TypeD>
){ ... }
正确实现方案

编辑方向是对的,但需修正几个关键问题:

  1. 必须显式声明@Bean方法的返回类型:原配置类中customExecutor和defaultExecutor方法未指定返回类型,Spring无法识别Bean的具体泛型类型,这是启动异常的核心原因。
  2. 泛型类型严格匹配:注入时的泛型参数必须与配置类中Bean定义的泛型完全一致,否则Spring无法匹配到目标Bean。
  3. Bean名称与@Qualifier精准对应:确保每个自定义Bean的名称唯一,注入时通过@Qualifier指定对应名称。

最终可运行的代码如下:

1. MyExecutor类(移除@Component注解)

class MyExecutor<INPUT_TYPE, OUTPUT_TYPE>(val myVar: String) {
    fun execute(input: INPUT_TYPE): OUTPUT_TYPE {
        // 此处编写业务逻辑实现
    }
}

2. 配置类AppConfig

@Configuration
class AppConfig {
    // 供ServiceB注入的myVar="abc"实例
    @Bean("abcExecutor")
    fun abcExecutor(): MyExecutor<TypeC, TypeD> {
        return MyExecutor("abc")
    }

    // 供ServiceA注入的myVar="xyz"实例
    @Bean("xyzExecutor")
    fun xyzExecutor(): MyExecutor<TypeA, TypeB> {
        return MyExecutor("xyz")
    }
}

3. 服务类注入实现

@Service
class ServiceA(
    @Qualifier("xyzExecutor") val executor: MyExecutor<TypeA, TypeB>
) {
    // ServiceA业务逻辑代码
}
@Service
class ServiceB(
    @Qualifier("abcExecutor") val executor: MyExecutor<TypeC, TypeD>
) {
    // ServiceB业务逻辑代码
}

额外注意事项

  • 如果TypeA/TypeB与TypeC/TypeD是相同的泛型组合,必须通过Bean名称+@Qualifier来区分实例,因为Spring无法通过相同泛型类型识别不同Bean。
  • 务必移除MyExecutor上的@Component注解,避免Spring自动生成默认实例,导致注入冲突。

内容的提问来源于stack exchange,提问作者ShailendraChoudhary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 01:30:08