当一个接口,有多个实现类且均已注入到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 { 。。。 }