最近开始学习Spring,在看《Spring实战4th》3.3“处理自动装配的歧义性”那一部分时,书上提到(也从网上看到了类似的用法): 通过在一个类上加注@Component以及@Qualifier(“x”)可以为其配置限定符来标识区分同一个接口下的不同实现类,用以在需要进行@Autowired自动装配的地方使用@Qualifier(“x”)来指定特定的实现类对象bean。
但是本人在练习过程中,IntelliJ通过上述方式识别不了,只能在@Bean处添加@Qualifier(“x”),在后续的测试中才能识别。如下:
在Dessert的实现类Cake上加上@Component以及@Qualifier(“Lovely”)
代码语言:javascript复制@Component
@Qualifier("Lovely")
public class Cake implements Dessert { }
然后是配置类
代码语言:javascript复制@Configuration
public class JavaConfig {
@Bean
Dessert cake() {
return new Cake();
}
@Bean
Dessert iceCream() {
return new IceCream();
}
}
测试类中无法识别:
代码语言:javascript复制@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = JavaConfig.class)
public class PlateTest {
@Autowired
@Qualifier("Lovely") // IDEA 提示"Cannot find bean with qualifier 'Lovely' "
Dessert dessert;
@Test
public void testNotNull() {
Assert.assertNotNull(dessert);
}
}
但是,测试能PASS,应该是IntelliJ中的识别BUG。虽然是一个BUG,但是个人的理解是推荐在配置Bean中,进行限定,而不是在每一个类处进行限定。如下在JavaConfig类中进行配置:
代码语言:javascript复制@Bean
@Qualifier("Lovely")
Dessert cake() {
return new Cake();
}
这样就不会出现报提示错。 以上在运行过程均没有错误,只是IDE辅助出现了问题。