1. 程式人生 > >@Component, @Repository, @Service, @Controller的區別

@Component, @Repository, @Service, @Controller的區別

原文
官網引用:
引用spring官方文件中的一段描述:

在Spring2.0之前的版本中,@Repository註解可以標記在任何的類上,用來表明該類是用來執行與資料庫相關的操作(即dao物件),並支援自動處理資料庫操作產生的異常

在Spring2.5版本中,引入了更多的Spring類註解:@Component,@Service,@Controller@Component是一個通用的Spring容器管理的單例bean元件。而@Repository, @Service, @Controller就是針對不同的使用場景所採取的特定功能化的註解元件。

因此,當你的一個類被@Component

所註解,那麼就意味著同樣可以用@Repository, @Service, @Controller來替代它,同時這些註解會具備有更多的功能,而且功能各異。

最後,如果你不知道要在專案的業務層採用@Service還是@Component註解。那麼,@Service是一個更好的選擇。

就如上文所說的,@Repository早已被支援了在你的持久層作為一個標記可以去自動處理資料庫操作產生的異常(譯者注:因為原生的java操作資料庫所產生的異常只定義了幾種,但是產生資料庫異常的原因卻有很多種,這樣對於資料庫操作的報錯排查造成了一定的影響;而Spring拓展了原生的持久層異常,針對不同的產生原因有了更多的異常進行描述。所以,在註解了@Repository

的類上如果資料庫操作中丟擲了異常,就能對其進行處理,轉而丟擲的是翻譯後的spring專屬資料庫異常,方便我們對異常進行排查處理)。

註解 含義
@Component 最普通的元件,可以被注入到spring容器進行管理
@Repository 作用於持久層
@Service 作用於業務邏輯層
@Controller 作用於表現層(spring-mvc的註解)

網上資料:
這幾個註解幾乎可以說是一樣的:因為被這些註解修飾的類就會被Spring掃描到並注入到Spring的bean容器中。

這裡,有兩個註解是不能被其他註解所互換的:

@Controller 註解的bean會被spring-mvc框架所使用。
@Repository 會被作為持久層操作(資料庫)的bean來使用
如果想使用自定義的元件註解,那麼只要在你定義的新註解中加上@Component即可:

@Component 
@Scope("prototype")
public @interface ScheduleJob {...}

這樣,所有被@ScheduleJob註解的類就都可以注入到spring容器來進行管理。我們所需要做的,就是寫一些新的程式碼來處理這個自定義註解(譯者注:可以用反射的方法),進而執行我們想要執行的工作。

@Component就是跟<bean>一樣,可以託管到Spring容器進行管理。

@Service, @Controller , @Repository = {@Component + 一些特定的功能}。這個就意味著這些註解在部分功能上是一樣的。

當然,下面三個註解被用於為我們的應用進行分層:

@Controller註解類進行前端請求的處理,轉發,重定向。包括呼叫Service層的方法
@Service註解類處理業務邏輯
@Repository註解類作為DAO物件(資料訪問物件,Data Access Objects),這些類可以直接對資料庫進行操作
有這些分層操作的話,程式碼之間就實現了鬆耦合,程式碼之間的呼叫也清晰明朗,便於專案的管理;假想一下,如果只用@Controller註解,那麼所有的請求轉發,業務處理,資料庫操作程式碼都糅合在一個地方,那這樣的程式碼該有多難拓展和維護。

總結
@Component, @Service, @Controller, @Repository是spring註解,註解後可以被spring框架所掃描並注入到spring容器來進行管理
@Component是通用註解,其他三個註解是這個註解的拓展,並且具有了特定的功能
@Repository註解在持久層中,具有將資料庫操作丟擲的原生異常翻譯轉化為spring的持久層異常的功能。
@Controller是spring-mvc的註解,具有將請求進行轉發,重定向的功能。
@Service是業務邏輯層註解,這個註解只是標註該類處於業務邏輯層。
用這些註解對應用進行分層之後,就能將請求處理,義務邏輯處理,資料庫操作處理分離出來,為程式碼解耦,也方便了以後專案的維護和開發。