一、问题描述
在spring的注解使用中,@Autowired注解的作用是注入bean,但是假如有一个接口,它包含两个实现类,这个时候应该怎么实现注入呢?
二、单个实现类使用情况
controller:
@RestController
@RequestMapping(value = "/user")
public class UserController {
@Autowired
private IUserService iUserService ;
@RequestMapping(value = "/getUsers23")
public List<User> getUsers2() {
List<User> users = iUserService .list();
return users;
}
}
service
public interface IUserService extends IService<User> {
}
serviceImpl
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
}
正常的代码,这样是正常的注入的
三、多个实现类情况
假如我现在还有一个实现类实现 IUserService,代码如下
@Service
public class UserServiceImpl1 extends ServiceImpl<UserMapper, User> implements IUserService {
}
这个时候,我们controler使用注解的方式不变,启动看看
可以看到,这个时候启动报错了。那么应该如何解决呢
方法一
这个时候,我们需要确定我们在controller中需要使用的是哪一个实现类,假如的是第一个,则我们使用第一实现类的名字作为注入参数的定义名称,代码如下
@RestController
@RequestMapping(value = "/user")
public class UserController {
//修改参数名称为需要注入的实现类的名称
@Autowired
private IUserService userServiceImpl;
@RequestMapping(value = "/getUsers23")
public List<User> getUsers2() {
List<User> users = userServiceImpl.list();
return users;
}
}
这时在启动,可以发现项目正常启动
方法二
controller正常按照单个实现类的引入
@RestController
@RequestMapping(value = "/user")
public class UserController {
@Autowired
private IUserService iUserService ;
@RequestMapping(value = "/getUsers23")
public List<User> getUsers2() {
List<User> users = iUserService .list();
return users;
}
}
service通过@Primary注解标明哪一个优先被注入
@Primary @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService { }
方法三
只需要在注入的时候,额外通过另外一个注解@Qualifier来标识需要注入实现类的名字
@RestController
@RequestMapping(value = "/user")
public class UserController {
@Autowired
@Qualifier("userServiceImpl1")
private IUserService iUserService ;
@RequestMapping(value = "/getUsers23")
public List<User> getUsers2() {
List<User> users = iUserService .list();
return users;
}
}