spring引進(jìn)注解之后大大簡(jiǎn)化了xml的配置,上手spring變得更加簡(jiǎn)單起來。本人也是剛剛上手spring不久,開始一頭霧水到能夠依葫蘆畫瓢花了一個(gè)月,到現(xiàn)在公司需要的基本的spring配置都能獨(dú)自搞定了,可見上手spring還是比較容易的。但是須知spring這么牛逼的框架應(yīng)該不會(huì)是一兩個(gè)月就能hold住的玩意,今天又踩了兩個(gè)坑,記錄一下。
公司的service調(diào)用采取的是遠(yuǎn)程調(diào)用方式,各個(gè)部門把各自對(duì)外提供的service用192.168.0.1:4080/services/XXX這樣的url暴露出來,在瀏覽器中是可以直接調(diào)用的,相應(yīng)地spring配置service的時(shí)候就不像平時(shí)自己寫代碼的時(shí)候配個(gè)com.xx.##impl這樣了,而是用url的方式。背景介紹完畢。
我在引用xxService的時(shí)候,不僅在spring-bean.xml中配置了,也在引用它的類中使用了@Autowired標(biāo)注了它,又有set方法,總之我認(rèn)為所有跟裝配有關(guān)的條件全部都加上了,自以為多重保證絕壁不會(huì)有bean初始化的問題。結(jié)果一運(yùn)行卻還是爆了錯(cuò),大惑不解?;艘粋€(gè)多小時(shí)才找到了問題所在。
原因在于@Autowired找適合的bean的時(shí)候是采取byType方式的,意思是如果我有個(gè)AService以及一個(gè)AServiceImpl實(shí)現(xiàn)了AService,為AService標(biāo)注了@Autowired則會(huì)先去你的代碼結(jié)構(gòu)中找到看看有沒有AServiceImpl這樣一個(gè)類,如果有就自動(dòng)裝配,沒有就報(bào)錯(cuò)。而先前已經(jīng)提過了,這是遠(yuǎn)程service,我的代碼結(jié)構(gòu)里肯定是找不到這個(gè)impl類的,因此即使我在spring-bean.xml中配置過同名的bean,autowired也沒法自動(dòng)裝配,解決方案非常簡(jiǎn)單,去掉autowired即可,那樣就變成了byName的方式去找了。這個(gè)故事告訴我們不要畫蛇添足。
如果強(qiáng)行要用Autowired的話。。。
還可以加個(gè)@Qualifier限定死名字讓Autowired知道用byName來找吧。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注