天天看點

@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​

​ + 一些特定的功能}。這個就意味着這些注解在部分功能上是一樣的。

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