Spring中如何区分调用的是哪个实现类

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


已有 0 条评论

    感谢参与互动!