Spring注解@Component、@Repository、@Service、@Controller區(qū)別

Spring 2.5 中除了提供 @Component 注釋外,還定義了幾個(gè)擁有特殊語(yǔ)義的注釋,它們分別是:@Repository、@Service 和 @Controller。

在目前的 Spring 版本中,這 3 個(gè)注釋和 @Component 是等效的,但是從注釋類的命名上,很容易看出這 3 個(gè)注釋分別和持久層、業(yè)務(wù)層和控制層(Web 層)相對(duì)應(yīng)。

雖然目前這3 個(gè)注釋和 @Component 相比沒(méi)有什么新意,但 Spring 將在以后的版本中為它們添加特殊的功能。

所以,如果 Web 應(yīng)用程序采用了經(jīng)典的三層分層結(jié)構(gòu)的話,最好在持久層、業(yè)務(wù)層和控制層分別采用上述注解對(duì)分層中的類進(jìn)行注釋。

@Service用于標(biāo)注業(yè)務(wù)層組件

@Controller用于標(biāo)注控制層組件(如struts中的action)

@Repository用于標(biāo)注數(shù)據(jù)訪問(wèn)組件,即DAO組件

@Component泛指組件,當(dāng)組件不好歸類的時(shí)候,我們可以使用這個(gè)注解進(jìn)行標(biāo)注。

[java]?view plain?copy

@Service??

public?class?VentorServiceImpl?implements?iVentorService?{?????

}??

@Repository??

public?class?VentorDaoImpl?implements?iVentorDao?{???

}??


在一個(gè)稍大的項(xiàng)目中,如果組件采用xml的bean定義來(lái)配置,顯然會(huì)增加配置文件的體積,查找以及維護(hù)起來(lái)也不太方便。?

Spring2.5為我們引入了組件自動(dòng)掃描機(jī)制,他在類路徑下尋找標(biāo)注了上述注解的類,并把這些類納入進(jìn)spring容器中管理。

它的作用和在xml文件中使用bean節(jié)點(diǎn)配置組件時(shí)一樣的。要使用自動(dòng)掃描機(jī)制,我們需要打開(kāi)以下配置信息:

代碼

[html]?view plain?copy


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??

xmlns:context="http://www.springframework.org/schema/context"??

xsi:schemaLocation="http://www.springframework.org/schema/beans??

????????????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd??

????????http://www.springframework.org/schema/context??

http://www.springframework.org/schema/context/spring-context-2.5.xsd">???


?????


1.component-scan標(biāo)簽?zāi)J(rèn)情況下自動(dòng)掃描指定路徑下的包(含所有子包),將帶有@Component、@Repository、@Service、@Controller標(biāo)簽的類自動(dòng)注冊(cè)到spring容器。對(duì)標(biāo)記了 Spring's @Required、@Autowired、JSR250's @PostConstruct、@PreDestroy、@Resource、JAX-WS's @WebServiceRef、EJB3's @EJB、JPA's @PersistenceContext、@PersistenceUnit等注解的類進(jìn)行對(duì)應(yīng)的操作使注解生效(包含了annotation-config標(biāo)簽的作用)。


getBean的默認(rèn)名稱是類名(頭字母小寫),如果想自定義,可以@Service(“aaaaa”)這樣來(lái)指定。

這種bean默認(rèn)是“singleton”的,如果想改變,可以使用@Scope(“prototype”)來(lái)改變。

可以使用以下方式指定初始化方法和銷毀方法:

[java]?view plain?copy

@PostConstruct??

public?void?init()?{???

}???

@PreDestroy??

public?void?destory()?{???

}???

注入方式:

把DAO實(shí)現(xiàn)類注入到action的service接口(注意不要是service的實(shí)現(xiàn)類)中,注入時(shí)不要new 這個(gè)注入的類,因?yàn)閟pring會(huì)自動(dòng)注入,如果手動(dòng)再new的話會(huì)出現(xiàn)錯(cuò)誤,

然后屬性加上@Autowired后不需要getter()和setter()方法,Spring也會(huì)自動(dòng)注入。

在接口前面標(biāo)上@Autowired注釋使得接口可以被容器注入,如:

[java]?view plain?copy

@Autowired??

@Qualifier("chinese")??

private?Man?man;???

當(dāng)接口存在兩個(gè)實(shí)現(xiàn)類的時(shí)候必須使用@Qualifier指定注入哪個(gè)實(shí)現(xiàn)類,否則可以省略,只寫@Autowired。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • 很長(zhǎng)時(shí)間沒(méi)做web項(xiàng)目都把以前學(xué)的那點(diǎn)框架知識(shí)忘光了,今天把以前做的一個(gè)項(xiàng)目翻出來(lái)看一下發(fā)現(xiàn)用·@Componen...
    Ray雷磊閱讀 654評(píng)論 0 0
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,255評(píng)論 6 342
  • 看待事情,需要多路思維,哪有什么非善即惡?一切以時(shí)間,地點(diǎn),條件為轉(zhuǎn)移。看待人,也要用辯證發(fā)展的眼光,未必真的就是...
    今曉白閱讀 270評(píng)論 0 0
  • 沒(méi)有告別的告別 作者:嶼上日光 你的來(lái)到 偶然的相識(shí) 陽(yáng)光亮麗 我被青春撞了一下腰 不該萌芽的愛(ài)情 在相識(shí)中滋長(zhǎng) ...
    嶼上日光閱讀 256評(píng)論 0 1

友情鏈接更多精彩內(nèi)容