在IntelliJ Idea中新建SpringBoot工程
在service层新建用于测试的接口及两个实现类:
QualifierService.java
package com.jake.singlecandy.service;
public interface QualifierService {
int getIndexOfImpl();
}
QualifierServiceImpl1.java
package com.jake.singlecandy.service.impl;
import com.jake.singlecandy.service.QualifierService;
import org.springframework.stereotype.Service;
@Service
public class QualifierServiceImpl1 implements QualifierService {
@Override
public int getIndexOfImpl() {
return 1;
}
}
QualifierServiceImpl2.java
package com.jake.singlecandy.service.impl;
import com.jake.singlecandy.service.QualifierService;
import org.springframework.stereotype.Service;
@Service
public class QualifierServiceImpl2 implements QualifierService {
@Override
public int getIndexOfImpl() {
return 1;
}
}
首先仅仅使用@Autowired进行自动注入,单元测试代码如下:
@Autowired
private QualifierService qualifierService;
@Test
public void testAutowired() {
int indexOfImpl = qualifierService.getIndexOfImpl();
System.out.println("index of impl is " + indexOfImpl);
}
此时没有使用@Qualifier指定实现类
执行单元测试方法,控制台报错:
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.jake.singlecandy.service.QualifierService' available: expected single matching bean but found 2: qualifierServiceImpl1,qualifierServiceImpl2
at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:215)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1113)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1062)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:583)
... 28 more
由报错可知,没有指定实现类
所以单元测试中注入部分的代码添加@Qualifier注解指定实现类:
@Autowired
@Qualifier("qualifierServiceImpl2")
private QualifierService qualifierService;
再次执行单元测试方法,得到输出结果:
index of impl is 2
对Bean工厂注解id的说明
以QualifierServiceImpl2为例,如果在@Service注解中没有填写bean id,那么默认为@Service("qualifierServiceImpl2")
,即id默认为类名首字母小写。相当于XML中的配置:
<bean id="qualifierServiceImpl2" class="com.jake.singlecandy.service.impl.QualifierServiceImpl2"/>
指定实现类时应为:
@Qualifier("qualifierServiceImpl2")
如果填写了bean id:
@Service("QualifierService2 ")
public class QualifierServiceImpl2 implements QualifierService {
@Override
public int getIndexOfImpl() {
return 1;
}
}
那么相当于XML配置:
<bean id="qualifierService2" class="com.jake.singlecandy.service.impl.QualifierServiceImpl2"/>
指定实现类时应为:
@Qualifier("qualifierService2")