Java 如何选择获得的实现';s被注入到自动连接的构造函数中

Java 如何选择获得的实现';s被注入到自动连接的构造函数中,java,spring,spring-boot,inversion-of-control,autowired,Java,Spring,Spring Boot,Inversion Of Control,Autowired,假设我有一个接口 interface IPerson {...} @Component class Programmer implements IPerson {...} @Component class LionTamer implements IPerson {...} 我有两个这个接口的实现 interface IPerson {...} @Component class Programmer implements IPerson {...} @Component class L

假设我有一个接口

interface IPerson {...}
@Component
class Programmer implements IPerson {...}

@Component
class LionTamer implements IPerson {...}
我有两个这个接口的实现

interface IPerson {...}
@Component
class Programmer implements IPerson {...}

@Component
class LionTamer implements IPerson {...}
假设我有一个使用Autowire注入的类

@Component
class SomethingThatDoesStuff { 

    @Autowired
    public SomethingThatDoesStuff (IPerson someone) {
        ...
    }

}

Spring如何知道要注入什么实现?有没有办法告诉spring要注入什么实现?这可以通过注释来完成吗?或者我必须定义某种工厂吗?如果是这样,怎么做?

正如@passion提到的,您应该使用bean命名():


@qualifier
可以。如果运行上述代码,理想情况下会出现Spring初始化错误,因为它会导致接口的两个实现。如上所述,您可以为两个实现添加限定符名称,在@Autowire中您可以提到限定符名称duplicate@RolsonQuadras你能用一个代码示例发布一个答案吗?如果你在
somethingtheatdoesstuff
中限定并选择一个,这难道不等于根本不使用构造函数di吗?我的意思是,我想你仍然可以在测试中使用它,但是对于代码来说,如果你需要更改哪一个,那么无论哪种方式,你都需要更新类中的依赖项,仅仅要求程序员在doesstuff构造函数的签名中键入它不是更优雅吗?也许,但在这种情况下,您可能希望利用IPerson提供的多态性。如果你能传递一个类类型而不仅仅是一个字符串,那就太酷了