今天刚毕业的小朋友问我这个问题,说看到篇文章,不太懂,然后我就搜了下,发现大家对这几个注解的解释都比较官方。
@Autowired是spring的,@Resource是JSR-250的。@Autowired按byType自动注入,而@Resource默认按 byName自动注入。
为了通俗易懂,我说简单点。
Service:
public interface IKingService {
public void saveXMan(List<Object> result);
}
public interface IQueenService {
public void saveHulk(List<Object> result);
}
Impl:
@Service(“ironMan”)
public class IronManKingServiceImpl implements IKingService {
@Override
public void saveXMan(List<Object> result) {
//略
}
}
@Service(“spiderMan”)
public class SpiderManKingServiceImpl implements IKingService {
@Override
public void saveXMan(List<Object> result) {
//略
}
}
@Service
public class SpiderManKingServiceImpl implements IQueenService{
@Override
public void saveHulk(List<Object> result) {
//略
}
}
Controller:
@Autowired
IQueenService queenService; //正常启动
@Autowired
@Qualifier("SpiderManKingServiceImpl")
IKingService kingService; //正常启动
@Resource
IQueenService queenService; //正常启动
@Resource(name="spiderMan")
IKingService kingService; //正常启动
@Resource(name="SpiderManKingServiceImpl")
IKingService kingService; //正常启动
@Autowired
IKingService kingService; //异常:同一type下多个实现类
@Autowired
@Qualifier("spiderMan ")
IKingService kingService; //异常:Qualifier可以按名称注入,但是是按类名
@Resource
IKingService kingService; //异常:多个实现类,没有指定是哪一个
总结:
1、@Autowired按byType自动注入单独使用时要求只能有一个实现类。
3、一个接口有多个实现类时@Autowired配合@Qualifier 使用可以按名称注入,但是是按照类名。
2、@Resource 可以通过 byName 和 byType的方式注入, 默认先按 byName的方式进行匹配,如果匹配不到,再按 byType的方式进行匹配。