Spring学习笔记:@Autowired的歧义性和解决方法

这片文章是对自己学习的总结,学习材料是Java EE互联网轻量级框架整合开发 SSM框架(Spring MVC + Spring + Mybatis)和Redis实现。作者是杨开振,周吉文,梁华辉和谭茂华。

本文可单独查看,也可以接着这片文章看。

@Autowired注解自动装配确实方便,但是会出现歧义性导致系统出错。比如我们定义一个接口RoleService并装配

@Component
public interface RoleService {
    @Autowired
    public void RoleService(Role role);
}

然后再定义两个类实现它并装配

@Component
public class RoleService1 implements RoleService{
    @Override
    public void RoleService(Role role) {
        System.out.println(role.sword + "1");
    }
}

@Component
public class RoleService2 implements RoleService{
    @Override
    public void RoleService(Role role) {
        System.out.println(role.sword + "2");
    }
}

现在出现一个新的类要自动装配,并且自动装配的类型是RoleService1和RoleService2实现的接口

@Component
public class controller {
    @Autowired
    private RoleService roleService;
}

这时,容器里有两个RoleService,系统会犯迷糊不知道选哪一个来装配,让系统迷糊就是出现了错误。

解决方法是使用@Primary和@Qualifier两个注解

 

 


@Primary

自动装配出现歧义性时,有@Primary标注的类具有优先选择权。比如

@Component
@Primary
public class RoleService1 implements RoleService{
    @Override
    public void RoleService(Role role) {
        System.out.println(role.sword + "1");
    }
}

那么出现文章一开始介绍的歧义性情况是,容器会直接选择RoleService1作为自动装配的赋值。

要注意,@Primary可以标注很多个类,在上面代码的基础上,我们可以给RoleService2也加上@Primary

@Component
@Primary
public class RoleService2 implements RoleService{
    @Override
    public void RoleService(Role role) {
        System.out.println(role.sword + "2");
    }
}

这样就变成了RoleService1和RoleService2具有优先性(和其它同类相比,如果有的话),容器要从这两者中选一个,当然肯定也出错。

 


@Qualifier

之前有歧义性是因为@Autowired寻找Bean都是通过类型寻找,而@Qualifier则是通过名称寻找的,这就消除了歧义性。用法如下

@Autowired
@Qualifier("roleService2")
private RoleService roleService = null;

装配时直接选用id为roleService2的Bean来赋值。

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值