今天剛畢業的小朋友問我這個問題,說看到篇文章,不太懂,然後我就搜了下,發現大家對這幾個註解的解釋都比較官方。
@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的方式進行匹配。