当前位置: 首页 > 知识库问答 >
问题:

Spring无法自动连线,有多个``类型的bean

苗森
2023-03-14

我的问题是:我有一个基本接口和两个实现类。

服务类依赖于基本接口,代码如下:

@Component
public interface BaseInterface {}
@Component
public class ClazzImplA implements  BaseInterface{}
@Component
public class ClazzImplB implements  BaseInterface{}

而配置是这样的:

@Configuration
public class SpringConfig {
    @Bean
    public BaseInterface clazzImplA(){
        return new ClazzImplA();
    }

    @Bean
    public BaseInterface clazzImplB(){
        return new ClazzImplB();
    }
}

服务类依赖于基础接口,将决定通过某些业务逻辑自动连接哪个实现。代码是这样的:

@Service
@SpringApplicationConfiguration(SpringConfig.class)
public class AutowiredClazz {
    @Autowired
    private BaseInterface baseInterface;

    private AutowiredClazz(BaseInterface baseInterface){
        this.baseInterface = baseInterface;
    }
}

这个想法引发了一个例外:无法自动连线。有多个bean属于BaseInterface类型。

虽然可以使用@Qualifier来解决这个问题,但在这种情况下,我不能选择dependencies类。

@Autowired
@Qualifier("clazzImplA")
private BaseInterface baseInterface;

我试图阅读spring文档,它提供了一个基于构造函数的依赖注入,但我仍然对这个问题感到困惑。

有人能帮我吗?

共有3个答案

姚建树
2023-03-14

如果使用@autowed,Spring会搜索与要自动连线的字段类型匹配的bean。在本例中,类型为BaseInterface的bean不止一个。这意味着Spring不能毫不含糊地挑选一个匹配的豆子。

在这种情况下,您没有其他选择来明确声明bean Spring应该使用或解决歧义。

邹博明
2023-03-14

仅使用spring框架无法解决这一问题。您提到,基于某种逻辑,您需要一个BaseInterface实例。这个用例可以使用工厂模式来解决。创建一个Bean,它实际上是BaseInterface的工厂

@Component
public class BaseInterfaceFactory{

  @Autowired
  @Qualifier("clazzImplA")
  private BaseInterface baseInterfaceA;

  @Autowired
  @Qualifier("clazzImplb")
  private BaseInterface baseInterfaceB;

  public BaseInterface getInstance(parameters which will decides what type of instance you want){
    // your logic to choose Instance A or Instance B
    return baseInterfaceA or baseInterfaceB
  }

}

配置(无耻地抄袭了另一条评论)

@Configuration
public class SpringConfig {
    @Bean(name="clazzImplA")
    public BaseInterface clazzImplA(){
        return new ClazzImplA();
    }

    @Bean(name="clazzImplB")
    public BaseInterface clazzImplB(){
        return new ClazzImplB();
    }
}

服务类

@Service
@SpringApplicationConfiguration(SpringConfig.class)
public class AutowiredClazz {
    @Autowired
    private BaseInterfaceFactory factory;

    public void someMethod(){
       BaseInterface a = factory.getInstance(some parameters);
       // do whatever with instance a
    }
}
韩玉石
2023-03-14

Spring混淆了您在配置类中声明的2个bean,因此您可以使用@Qualifer注释以及@autowled来通过指定哪个bean将被连接来消除混淆,将这些修改应用于您的配置类

@Configuration
public class SpringConfig {
    @Bean(name="clazzImplA")
    public BaseInterface clazzImplA(){
        return new ClazzImplA();
    }

    @Bean(name="clazzImplB")
    public BaseInterface clazzImplB(){
        return new ClazzImplB();
    }
}

然后在@autowired注释

@Service
@SpringApplicationConfiguration(SpringConfig.class)
public class AutowiredClazz {
    @Autowired
    @Qualifier("the name of the desired bean")
    private BaseInterface baseInterface;

    private AutowiredClazz(BaseInterface baseInterface){
        this.baseInterface = baseInterface;
    }
}
 类似资料:
  • 大家好,我是Spring安保和jwt的新人。我正在我的spring boot项目中实现Jwt以确保用户登录安全,我使用的是spring boot 2.1.5,我不太了解spring boot 2中的新bean限制 @自动安装用户详细信息服务jwtUserDemailsService 谚语。。。无法自动连线。用户详细信息服务类型的 bean 不止一个。 谁能解释一下这里发生了什么问题,为什么我不能自

  • 问题内容: 我在Spring定义了这样的地图: 然后,我将该bean自动装配为定义为的属性: 这样做时,会抛出一个异常,说: `Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘DutyCreator’: Injection of autowired

  • 试图在SpringBoot应用程序中创建bean,但出现以下错误“无法自动连线。找不到“InstructionRepository”类型的bean” InstructionRepository在jar中用@Repository注解,是一个扩展Spring数据接口的接口 ScheduleProcessor是一种方法 当我尝试通过传递基本包值来添加@ComponentScan注释时,错误消失了,但是,

  • 我想使用Jooq在postgres数据库中插入数据这是我的服务类 但是我有这个错误 无法自动连线。找不到“DSLContext”类型的bean。

  • 问题内容: 我有一个通过调用构造函数实例化的类(Class ABC)。ABC类又具有通过自动接线注入的辅助类(XYZ类)。 我们的是基于Spring MVC的应用程序,在服务器启动时我看不到任何异常。 但是我仍然看到XYZ类为空。是否是因为Spring Container没有实例化ABC类? 在这种情况下,如何使用自动接线? 谢谢。 问题答案: 你可以使用这种方式在非spring bean类中使用

  • 问题内容: 需要一些帮助,我刚刚开始学习Spring,似乎无法弄清楚我们的错: Application.java-没有包 User.java-包com.mapping UserDAO.java-包com.accesors Root.java-包com.controllers 当我运行项目时,我似乎得到了以下启示 堆栈跟踪: 据我了解,这意味着@ComponentScan没有检测到软件包 问题答案: