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> ){ ... }
正确实现方案
编辑方向是对的,但需修正几个关键问题:
- 必须显式声明@Bean方法的返回类型:原配置类中
customExecutor和defaultExecutor方法未指定返回类型,Spring无法识别Bean的具体泛型类型,这是启动异常的核心原因。 - 泛型类型严格匹配:注入时的泛型参数必须与配置类中Bean定义的泛型完全一致,否则Spring无法匹配到目标Bean。
- 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
相关产品推荐
相关产品推荐

