引用spring的官方文檔中的一段描述:html
在Spring2.0以前的版本中,@Repository
註解能夠標記在任何的類上,用來代表該類是用來執行與數據庫相關的操做(即dao對象),並支持自動處理數據庫操做產生的異常前端
在Spring2.5版本中,引入了更多的Spring類註解:@Component
,@Service
,@Controller
。@Component
是一個通用的Spring容器管理的單例bean組件。而@Repository
, @Service
, @Controller
就是針對不一樣的使用場景所採起的特定功能化的註解組件。java
所以,當你的一個類被@Component
所註解,那麼就意味着一樣能夠用@Repository
, @Service
, @Controller
來替代它,同時這些註解會具有有更多的功能,並且功能各異。git
最後,若是你不知道要在項目的業務層採用@Service
仍是@Component
註解。那麼,@Service
是一個更好的選擇。github
就如上文所說的,@Repository
早已被支持了在你的持久層做爲一個標記能夠去自動處理數據庫操做產生的異常(譯者注:由於原生的java操做數據庫所產生的異常只定義了幾種,可是產生數據庫異常的緣由卻有不少種,這樣對於數據庫操做的報錯排查形成了必定的影響;而Spring拓展了原生的持久層異常,針對不一樣的產生緣由有了更多的異常進行描述。因此,在註解了@Repository
的類上若是數據庫操做中拋出了異常,就能對其進行處理,轉而拋出的是翻譯後的spring專屬數據庫異常,方便咱們對異常進行排查處理)。spring
註解 | 含義 |
---|---|
@Component | 最普通的組件,能夠被注入到spring容器進行管理 |
@Repository | 做用於持久層 |
@Service | 做用於業務邏輯層 |
@Controller | 做用於表現層(spring-mvc的註解) |
這幾個註解幾乎能夠說是同樣的:由於被這些註解修飾的類就會被Spring掃描到並注入到Spring的bean容器中。數據庫
這裏,有兩個註解是不能被其餘註解所互換的:spring-mvc
@Controller
註解的bean會被spring-mvc框架所使用。 @Repository
會被做爲持久層操做(數據庫)的bean來使用
若是想使用自定義的組件註解,那麼只要在你定義的新註解中加上@Component便可:mvc
@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
層是業務邏輯層註解,這個註解只是標註該類處於業務邏輯層。
用這些註解對應用進行分層以後,就能將請求處理,義務邏輯處理,數據庫操做處理分離出來,爲代碼解耦,也方便了之後項目的維護和開發。