一个接口有两个实现类,在Spring中怎么去调用到自己想调用的实现类?
一. 接口
package com.xizi.service;
public interface UserService {
void test();
}
二. 实现类1
package com.xizi.service;
@Service("userService")
public class UserServiceImpl implements UserService {
@Override
public void test() {
System.out.println("测试实现1-----------");
}
}
三. 实现类2
package com.xizi.service;
@Service("userServiceImpl2")
public class UserServiceImpl2 implements UserService {
@Override
public void test() {
System.out.println("测试实现2-----------");
}
}
四.注解注入进行测试
@Autowired
- @Autowired 的注入方式是 byType 注入, 当要注入的类型在容器中存在多个时,Spring是不知道要引入哪个实现类的,所以会报错。
@Resource
- @Resource 默认是按照 byName 的方式注入的, 如果通过 byName 的方式匹配不到,再按 byType 的方式去匹配。
package com.xizi.controller;
@RestController
public class UserController {
@Resource(name = "userServiceImpl2")
private UserService userService;
@RequestMapping("/test")
public void test(){
userService.test();
}
}
@Qualifier和 @Autowired配合使用
- @Qualifier 注解也是 byName的方式,是直接按照名字进行搜索,对于UserServiceImpl 上面@Service注解必须写名字,不写就会报错,而且名字必须是
@Autowired @Qualifie("userServiceImpl")
保持一致
package com.xizi.controller;
@RestController
public class UserController {
@Autowired
@Qualifier("userServiceImpl")
private UserService userService;
@RequestMapping("/test")
public void test(){
userService.test();
}
}