javascript
Spring中常用注解及其作用(二)
9.@AutoWired
這個(gè)注解的英文直譯是“自動(dòng)裝配”,“自動(dòng)注入”
它就像一根水管一樣,兩端接上水桶,然后就可以把一個(gè)桶里面的水自動(dòng)注入到另一個(gè)桶中。
這兩端的桶,可以是 類成員變量/方法/構(gòu)造函數(shù)
中間流的水,可以是 數(shù)組/集合/Map/父類屬性
一般使用場(chǎng)景:
@Servicepublic class UserService {@Autowired//定義一個(gè)變量來(lái)接收注入過(guò)來(lái)的類private UserRepository userRepository;public void save(){//然后就可以通過(guò)點(diǎn)來(lái)調(diào)用這個(gè)類里面的方法userRepository.save();}}注意事項(xiàng):
@Autowired是ByType的,在使用時(shí)首先在容器中查詢對(duì)應(yīng)類型的bean
如果查詢結(jié)果剛好為一個(gè),就將該bean裝配給@Autowired指定的數(shù)據(jù)
如果查詢的結(jié)果不止一個(gè),那么@Autowired會(huì)根據(jù)名稱來(lái)查找(首字母小寫)。
如果查詢的結(jié)果為空,那么會(huì)拋出異常。解決方法是,@AutoWired(required=false)
@AutoWired加在變量/方法上面與加在構(gòu)造器上面有什么區(qū)別?
答:加在構(gòu)造器上面更保險(xiǎn)一些。
因?yàn)镴ava變量的初始化順序?yàn)?#xff1a;
靜態(tài)變量或靜態(tài)語(yǔ)句塊–>實(shí)例變量或初始化語(yǔ)句塊–>構(gòu)造方法–>@Autowired
如果在加在變量/方法上面,那么下面這段代碼就會(huì)報(bào)錯(cuò)
@Autowired private User user; private String school;public UserAccountServiceImpl(){this.school = user.getSchool(); }因?yàn)橄葧?huì)執(zhí)行構(gòu)造方法,而這個(gè)時(shí)候還沒(méi)有注入,所以get不出來(lái),會(huì)報(bào)空指針錯(cuò)誤。
相反,如果加在構(gòu)造器上面就不會(huì)報(bào)錯(cuò)。如下:
private User user; private String school;@Autowired public UserAccountServiceImpl(User user){this.user = user;this.school = user.getSchool(); }10.Qualifer
這個(gè)注解是用來(lái)輔助@AutoWired注解來(lái)使用的。
用于當(dāng)@AutoWired在注入父類屬性時(shí)有兩個(gè)或以上實(shí)現(xiàn)類時(shí),指定要用哪個(gè)。
👆上面在@AutoWired注解里面說(shuō)了,當(dāng)實(shí)現(xiàn)類有多個(gè)的時(shí)候,它會(huì)自動(dòng)去找和它名稱相同的實(shí)現(xiàn)類(首字母小寫),但如果我們不想這樣,就可以加一個(gè)@Qualifer注解來(lái)指定具體要注入哪一個(gè)實(shí)現(xiàn)類。
舉例如下??:
//父級(jí)接口 public interface IMenuService {/*** 獲取所有菜單列表* * @return List<MenuEntity>*/public List<MenuEntity> getAllMenuList(); }//實(shí)現(xiàn)類1 @Service("menuService1") public class MenuServiceImpl implements IMenuService {@Autowiredprivate MenuMapper mapper;/*** 獲取所有菜單*/@Overridepublic List<MenuEntity> getAllMenuList() {MenuEntityExample example = new MenuEntityExample();long start = System.currentTimeMillis();example.setDistinct(false);List<MenuEntity> allMneuList = mapper.selectByExample(example);}//實(shí)現(xiàn)類2 @Service("menuService2") public class MenuServiceImpl implements IMenuService {/*** 獲取所有菜單*/@Overridepublic List<MenuEntity> getAllMenuList() {return null;}現(xiàn)在如果想要注入實(shí)現(xiàn)類1的話,應(yīng)該這樣??
@Autowired@Qualifier("menuService1")private IMenuService menuService;想要 注入實(shí)現(xiàn)類2的話,應(yīng)該這樣??
@Autowired@Qualifier("menuService2")private IMenuService menuService;11.@Resource
這個(gè)注解的作用和@AutoWired一致,
只不過(guò)@AutoWired是ByType的,而@Resource是ByName的
@AutoWired首先按類型查找,同類型的有多個(gè)時(shí),才按照首字母小寫來(lái)匹配
@Resource首先按照名稱查找,沒(méi)有對(duì)應(yīng)名稱時(shí),才按照類型匹配
總結(jié)
以上是生活随笔為你收集整理的Spring中常用注解及其作用(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【opencv14】cv::Mat---
- 下一篇: SpringBoot项目打包成jar后,