解决自动装配歧义性
我们先创建一个接口;
public interface UserService {
void add();
}
在创建两个实现类和测试类
实现类
@Component
public class UserServiceNormal implements UserService {
@Override
public void add() {
System.out.println("添加用户。。。。");
}
}
@Component
public class UserServiceFestival implements UserService {
@Override
public void add() {
System.out.println("用户注册。。。。");
}
}
测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void testAdd(){
userService.add();
}
}
然后我们运行程序时会报错,原因在userService,因为我在上面创建了两个实现类,这是userService无法断定要选哪个实现类。
所以我们解决这个问题。
方法1
使用首选bean
两个实现类中选一个为首选bean,加==@Primary==注解。
方法2
使用限定符
在两个实现类当中使用 @Qualifier 注解,然后加限定符。
例如:UserServiceNormal类 @Qualifier(“normal”)
@Component
@Qualifier(“normal”)
public class UserServiceNormal implements UserService {
@Override
public void add() {
System.out.println("添加用户。。。。");
}
}
UserServiceFestival类 @Qualifier(“festival”)
@Component
@Qualifier(“festival”)
public class UserServiceFestival implements UserService {
@Override
public void add() {
System.out.println("用户注册。。。。");
}
}
然后在测试类中加
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class UserServiceTest {
@Autowired
@Qualifier(“festival”)
//@Qualifier(“normal”)
private UserService userService;
@Test
public void testAdd(){
userService.add();
}
}
方法3
限定符和类ID结合使用
直接在@Component注解中设置类ID
例如:
@Component(“festival”)
public class UserServiceFestival implements UserService {
@Override
public void add() {
System.out.println("用户注册。。。。");
}
}
然后在测试类中用@Qualifier指定实现类。
或者不在@Component注解中明确设置类ID,spring会给这个类分配默认的ID,就是类名首写字母小写,其他的不变。
例如:
UserServiceFestival类的ID是userServiceFestival