@Autowired @Resource @Qualifier註解的區別

今天剛畢業的小朋友問我這個問題,說看到篇文章,不太懂,然後我就搜了下,發現大家對這幾個註解的解釋都比較官方。

@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的方式進行匹配。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章