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

一、问题描述

在spring的注解使用中,@Autowired注解的作用是注入bean,但是假如有一个接口,它包含两个实现类,这个时候应该怎么实现注入呢?

二、单个实现类使用情况

controller:

@RestController
@RequestMapping(value = "/user")
public class UserController {


    @Autowired
    private IUserService iUserService ;



    @RequestMapping(value = "/getUsers23")
    public List getUsers2() {
        List users = iUserService .list();
        return users;
    }

}

 

service

public interface IUserService extends IService {
}

serviceImpl

@Service
public class UserServiceImpl extends ServiceImpl implements IUserService {
}

正常的代码,这样是正常的注入的

三、多个实现类情况

假如我现在还有一个实现类实现 IUserService,代码如下

@Service
public class UserServiceImpl1 extends ServiceImpl implements IUserService {
}

 

这个时候,我们controler使用注解的方式不变,启动看看

如何使用@Autowired注入含有多个实现类的接口_第1张图片

可以看到,这个时候启动报错了。那么应该如何解决呢

方法一

这个时候,我们需要确定我们在controller中需要使用的是哪一个实现类,假如的是第一个,则我们使用第一实现类的名字作为注入参数的定义名称,代码如下

@RestController
@RequestMapping(value = "/user")
public class UserController {
    
   //修改参数名称为需要注入的实现类的名称
    @Autowired
    private IUserService userServiceImpl;



    @RequestMapping(value = "/getUsers23")
    public List getUsers2() {
        List users = userServiceImpl.list();
        return users;
    }

}

这时在启动,可以发现项目正常启动

方法二

controller正常按照单个实现类的引入

@RestController
@RequestMapping(value = "/user")
public class UserController {


    @Autowired
    private IUserService iUserService ;



    @RequestMapping(value = "/getUsers23")
    public List getUsers2() {
        List users = iUserService .list();
        return users;
    }

}

service通过@Primary注解标明哪一个优先被注入

@Primary
@Service
public class UserServiceImpl extends ServiceImpl implements IUserService {
}

方法三

只需要在注入的时候,额外通过另外一个注解@Qualifier来标识需要注入实现类的名字

@RestController
@RequestMapping(value = "/user")
public class UserController {


    @Autowired
    @Qualifier("userServiceImpl1")
    private IUserService iUserService ;



    @RequestMapping(value = "/getUsers23")
    public List getUsers2() {
        List users = iUserService .list();
        return users;
    }

}

你可能感兴趣的:(spring,学习,Autowired使用)