如何使用@Autowired注入含有多个实现类的接口

一、问题描述

在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;
    }

}

  • 10
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值