当一个接口,有多个实现类且均已注入到spring容器中了,使用时@AutoWired是byType的,而这些实现类类型都相同,此时就需要使用@Qualifier明确指定使用那个实现类。因此,@Qualifier是byName的。

public interface Formatter {
    String format();
}

@Component("fooFormatter")
public class FooFormatter implements Formatter {
    @Override
    public String format() {
        return "foo";
    }
}

@Component("barFormatter")
public class BarFormatter implements Formatter {
    @Override
    public String format() {
        return "bar";
    }
}

idea提示,必须添加@Qualifier,否则红线。

 最后,形如:

@SpringBootTest
class QualifierTest {
    @Qualifier("barFormatter")
    @Autowired
    private Formatter formatter;
    @Test
    void test() {
        System.out.println(formatter.format());
    }
}

执行,输出:bar

如果将barFormatter改成fooFormatter,输出:foo。

对于实现类,可不用在@Compoment后的括号里声明名称,可以新增@Qualifier指定名称,如:

@Component
@Qualifier("fooFormatter")
public class FooFormatter implements Formatter {
。。。
}
@Component
@Qualifier("barFormatter")
public class BarFormatter implements Formatter {
。。。
}
01-15 17:04