- @Component與@Component("name")
區(qū)別:
@Component("name"):相當(dāng)于給這個(gè)組件Bean設(shè)置非默認(rèn)的ID標(biāo)識(shí),并命名為name.
@Componen 不加name的話,Bean的ID默認(rèn)為類型的首字母小寫(xiě)。 - @ComponentScan
表示:掃描當(dāng)前類的包以及其子包,將標(biāo)記@Component的類自動(dòng)生成Bean。 - @ComponentScan("packagePath")
當(dāng)把配置集中放入某個(gè)地方時(shí),@ComponentScan只能掃描當(dāng)前類的包及其子包(基礎(chǔ)包),聲明在其他地方的component就無(wú)法掃描到了,因此需要加上("packagePath"),來(lái)指定掃描哪個(gè)基礎(chǔ)包。
多個(gè)包:
@ComponentScan(basePackages={"packagePath1","packagePath2","packagePath"3})
缺點(diǎn):重構(gòu)時(shí),可能會(huì)出錯(cuò)。
改進(jìn)方法:使用包中的類或者接口名替代packagePath,如:
@ComponentScan(basePackageClasses={ClassOne.class,ClassTwo.class}),這些類所在的包會(huì)被當(dāng)做組件掃描時(shí)的基礎(chǔ)包。
如果項(xiàng)目重構(gòu)時(shí),作為基礎(chǔ)包的類型或者接口被移除了,那么重構(gòu)時(shí)還是有風(fēng)險(xiǎn),可以使用 空標(biāo)記接口(marker interface)來(lái)指定掃描位置。
就是建一個(gè)空的接口,什么事都不干,將其作為基礎(chǔ)包。這樣,就不會(huì)引用項(xiàng)目的具體類了。
@ContextConfiguration(classed=Xx.class)
在何處加載配置@Autowired 與@Inject
@Autowired是spring特有的注解。
@Inject 來(lái)源于java依賴注入規(guī)范。
大多數(shù)情況下,可以通用
@Autowired(required=false)
@Autowired可以用在類字段里,也可以標(biāo)注在setter方法上。
當(dāng)標(biāo)注為@Autowired時(shí),會(huì)自己加載,如果沒(méi)有匹配上,會(huì)報(bào)異常。設(shè)置為required=false,會(huì)嘗試自動(dòng)裝配,如果沒(méi)有匹配到bean,也不報(bào)異常。但是代碼如果沒(méi)有檢測(cè)Null值的話,會(huì)報(bào)null pointer exception。
自動(dòng)裝配多個(gè)bean符合裝配時(shí)的選擇(裝配歧義):
- @ResponseStatus(value,reason)
應(yīng)答狀態(tài),通常用于目標(biāo)方法上,不管該方法有沒(méi)有異常,都拋出指定的異常狀態(tài)。
如果沒(méi)有異常,目標(biāo)方法執(zhí)行完畢。
參數(shù)value表示異常狀態(tài),reason表示該異常的描述。
用在類上聲明,則表示自定義的異常類。
通過(guò)throw new Class() 拋出。
- @ResponseBody
用在控制器方法上,表示該方法返回一個(gè)對(duì)象,而不是路徑。
該對(duì)象是Json格式的對(duì)象。