Spring中一个接口两个实现类如何区分调用的是哪个实现类
定义接口
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
注意:本文归作者所有,未经作者允许,不得转载