@Resource默认按照名称方式进行bean匹配,@Autowired默认按照类型方式进行bean匹配
@Resource(import javax.annotation.Resource;)是J2EE的注解,@Autowired( import org.springframework.beans.factory.annotation.Autowired;)是Spring的注解
一、@Resource注入
现在有一个接口Human和两个实现类ManImpl、WomanImpl,在service层的一个bean中要引用了接口Human,这种情况处理如下:
接口Human
public interface Human {
public void speak();
public void walk();
}
实现类ManImpl
package testwebapp.com.wangzuojia.service.impl;
import org.springframework.stereotype.Service;
import testwebapp.com.wangzuojia.service.Human;
@Service
public class ManImpl implements Human {
public void speak() {
System.out.println(" man speaking!");
}
public void walk() {
System.out.println(" man walking!");
}
}
实现类WomanImpl
@Service
public class WomanImpl implements Human {
public void speak() {
System.out.println(" woman speaking!");
}
public void walk() {
System.out.println(" woman walking!");
}
}
主调类SequenceServiceImpl
@Service
public class SequenceServiceImpl implements SequenceService {
//起服务此处会报错
@Resource
private Human human;
}
报错的地方给我们提示了:but found 2: manImpl,womanImpl 意思是Human有两个实现类。解决方案如下:
@Service
public class SequenceServiceImpl implements SequenceService {
@Resource(name = "manImpl")
//注意是manImpl不是ManImpl,
//因为使用@Service,容器为我们创建bean时默认类名首字母小写
private Human human;
}
这样启动服务就不会报错了。
如果是使用的@Autowired注解,要配上@Qualifier(“manImpl”),代码如下:
@Service
public class SequenceServiceImpl implements SequenceService {
@Autowired
@Qualifier("manImpl")
private Human human;
}
详细原文:https://blog.youkuaiyun.com/wangzuojia001/article/details/54312074