在一個(gè)稍大的項(xiàng)目中,通常會(huì)有上百個(gè)組件,如果這些組件采用xml的bean定義來(lái)配置,顯然會(huì)增加配置文件的體積,查找以及維護(hù)起來(lái)也不太方便。 Spring2.5為我們引入了組件自動(dòng)掃描機(jī)制,他可以在類路徑底下尋找標(biāo)注了@Component,@Service,@Controller,@Repository等注解的類,并把這些類納入進(jìn)spring容器中管理。它的作用和在xml文件中使用bean節(jié)點(diǎn)配置組件時(shí)一樣。下面對(duì)平時(shí)用到的標(biāo)簽做一下整理。
@Service用于標(biāo)注業(yè)務(wù)層組件,@Controller用于標(biāo)注控制層組件(如struts中的action),@Repository用于標(biāo)注數(shù)據(jù)訪問組件,即DAO組件,而@Component泛指組件,當(dāng)組件不好歸類的時(shí)候,我們可以使用這個(gè)注解進(jìn)行標(biāo)注。
Spring不但支持自己定義的@Autowired注解,還支持幾個(gè)由JSR-250規(guī)范定義的注解,它們分別是@Resource、@PostConstruct以及@PreDestroy
@PostConstruct
@PostConstruct注解的方法將會(huì)在依賴注入完成后被自動(dòng)調(diào)用。他用來(lái)修飾一個(gè)非靜態(tài)的void()方法。如果想在生成對(duì)象時(shí)候完成某些初始化操作,而偏偏這些初始化操作又依賴于依賴注入,那么就無(wú)法在構(gòu)造函數(shù)中實(shí)現(xiàn)。為此,可以使用@PostConstruct注解一個(gè)方法來(lái)完成初始化
@PreDestroy
@PreDestroy修飾的方法會(huì)在服務(wù)器卸載Servlet的時(shí)候運(yùn)行,并且只會(huì)被服務(wù)器調(diào)用一次,類似于Servlet的destroy()方法。被@PreDestroy修飾的方法會(huì)在destroy()方法之后運(yùn)行,在Servlet被徹底卸載之前。
@Autowired VS @Resource
@Autowired(這個(gè)注解來(lái)自spring的),默認(rèn)按類型裝配,默認(rèn)情況下必須要求依賴對(duì)象必須存在,如果要允許null值,可以設(shè)置它的required屬性為false,如:@Autowired(required=false),如果我們想使用名稱裝配可以結(jié)合@Qualifier注解進(jìn)行使用
@Resource(這個(gè)注解屬于J2EE的),默認(rèn)按名稱裝配,但是需要注意的是,如果name屬性一旦指定,就只會(huì)按照名稱進(jìn)行裝配
加上標(biāo)簽之后都不需要再編寫getter、setter方法。
@Autowired(required=false) @Qualifier("baseDao")
private BaseDao baseDao;
?
@Resource(name="baseDao")
private BaseDao baseDao;