当前位置: 首页 > 面试题库 >

弹簧无法自动接线,有一个以上的``类型的豆

晁绍辉
2023-03-14
问题内容

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

一个Service类在基本接口上有一个依赖关系,代码如下:

@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;
    }
}

IDEA抛出一个异常:无法自动装配,BaseInterface类型不止一个bean 。

尽管可以使用@Qualifier解决此问题,但是在这种情况下,我无法选择依赖项类。

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

我试图阅读spring文档,它提供了一个问题, Constructor-based dependency injection
但我仍然对该问题感到困惑。

谁能帮我 ?


问题答案:

Spring在配置类中声明的2个bean之间是混乱的,因此您可以使用@Qualifier批注以及@Autowired通过指定要连接的确切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;
    }
}


 类似资料:
  • 问题内容: 我有一个接口IMenuItem 然后我有一个接口实现 有什么方法可以仅使用IMenuItem接口从配置类创建MenuItem的多个实例?与@autowired之类的?还可以通过指定构造函数的参数来自动装配吗? 问题答案: 实际上对于这种情况是完美的。您可以自动连接特定的类(实现)或使用接口。 考虑以下示例: 现在,您可以根据注释值选择对象的名称,从而选择使用其中一种实现方式 像这样:

  • 问题内容: 在我的项目中,我正在尝试迁移的所有用法 进入 好处是显而易见的:类型安全,减少卷积代码,减少无用的常量等。通常,此类行位于静态旧有上下文中,在这种情况下,此类接线是唯一的选择。 一切都很好,直到有一天用户开始抱怨缓慢是由Spring内部产生的。因此,我启动了探查器以在 其中有一个昂贵的电话 。 我迅速创建了一个小型性能测试,以找出字符串名称和类型查找之间的速度差异高达 350 倍(我正

  • 我的问题是:我有一个基本接口和两个实现类。 服务类依赖于基本接口,代码如下: 而配置是这样的: 服务类依赖于基础接口,将决定通过某些业务逻辑自动连接哪个实现。代码是这样的: 这个想法引发了一个例外:无法自动连线。有多个bean属于类型。 虽然可以使用@Qualifier来解决这个问题,但在这种情况下,我不能选择dependencies类。 我试图阅读spring文档,它提供了一个基于,但我仍然对这

  • 问题内容: 我处理遗留代码库,其中未在春天有线了一类需要获得一类 是 在春季接线。我希望创建一个在启动时已连接的工厂类,然后可以调用getInstance()方法来获取一个连接对象。最好的方法是什么? 例: 我需要在启动时连接FooFactory,以便LegacyA可以简单地调用getInstance(),以便它返回Foo的实例(这也是在应用程序上下文中定义的bean)。 编辑:我不得不重新整理我

  • 问题内容: 使用Spring接线,如果我有一个接口的多个实现,则可以使用@Qualifier指定我想要的接口。 例如,假设我有一个 和一个 然后,我可以选择一个特定的实现: 但是有没有一种方法可以根据环境选择实现? 即,如果将spring.profiles.active设置为local,则将选择Car的“ Toyota”实现,但是如果将spring.profiles.active设置为dev或st

  • 问题内容: 我到处都读到有关Spring如何鼓励您在代码中使用接口的信息。我没看到 您的spring xml配置中没有接口的概念。Spring的哪一部分实际上鼓励您使用接口(而不是文档)? 问题答案: 为类定义接口时,它有助于进行依赖项注入。您的Spring配置文件本身不包含任何有关接口的信息-您只需输入类的名称即可。 但是,如果您要注入另一个提供“等效”功能的类,则使用接口确实会有所帮助。 例如