所报错误:
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.liu.spring.service.UserService' available: expected single matching bean but found 2: userServiceFestival,userServiceNormal
代码所在的见路径:
当UserService有两个实例UserServiceNormal,UserServiceFestival是如下的代码出现了接口歧义性的错误(不属于编译错误可以运行,有的继承开发环境在编译是可能不会报这样的错误)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=AppConfig.class)
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void testAdd(){
userService.add();
}
}
@Autowired 会发生歧义性的错误,这时我们可以通过声明实例的方式解决:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=AppConfig.class)
public class UserServiceTest {
@Autowired
private UserServiceNormal userService;
//Or
@Autowired
private UserServiceNormal userService1;
@Test
public void testAdd(){
userService.add();
}
}
但是上述的方法违背我们使用Spring框架的初衷,我们可以用Spring相关的三种方式:
首选Bean法:
@Component
@Primary //首选Bean标识符,缺点是只能标识一个
public class UserServiceFestival implements UserService {
@Override
public void add() {
System.out.println("注册用户并发送优惠券");
}
}
限定符法:
@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") //在测试类中的相关标记
private UserService userService;
@Test
public void testAdd(){
userService.add();
}
}
类ID法(标记的类ID以及默认的类ID):
@Component("festival") //类ID标识
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") //在测试类中的相关标记
private UserService userService;
@Test
public void testAdd(){
userService.add();
}
}
Java的标准解决方法——Resource(name=""):
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=AppConfig.class)
public class UserServiceTest {
// @Autowired
// @Qualifier("festival")
@Resource(name = "userServiceFestival")
private UserService userService;
@Test
public void testAdd(){
userService.add();
}
}
Resource可以代替Autowired和Qualifier两个注解,他是属于jdk的一种方法,name中的值可以自己指定ID同样也可以使用默认的ID来进行标记