JAVA-一个接口两个实现类如何区分调用的是哪个实现类

定义接口

public interface TestService {
    ...
}

实现类A

@Service("testService")
public class TestServiceImpl implements TestService {
    ...
}

实现类B

@Service("testNewService")
public class TestNewServiceImpl implements TestService {
    ...
}

引用代码

// A
@Autowired
private TestService testService;

// B
@Resource
private TestService testService;

// C
@Resource(name = "testService")
private TestService testService;

// D
@Resource(name = "testNewService")
private TestService testService;

引用A 报错

引用B和引用C 引用的是实现类A

引用D 引用的是实现类B

 

@Autowired默认按类型进行装配,@Resource默认按照名称进行装配。

@Autowired根据类型,从Spring上下文中找到类型匹配的唯一bean进行装配,找不到或找到多个,都抛出异常,示例会找到两个Bean所以引用A会报错,@Resource既没指定name,也没指定type时则自动按照byName方式进行装配。如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。所以引用B和引用C都可以找到实现类A,因为实现类用@Service进行了命名,如果没有使用@Service,默认为当前类名,首字母小写。因此引用D通过name="testNewService"找到了实现类B

 

 

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值