一文了解Spring中Component、Service、Controller和Repository之間的區別

在學習Spring框架中的@Component、@Service、@Controller和@Repository註釋之間的區別以前,瞭解@Component註釋在Spring中的做用是很重要的。在Spring的初始版本中,全部bean都使用XML文件聲明。這對於一個大項目而言就會變成一個艱鉅的任務,Spring人員很快就意識到這個問題。在以後的版本中,他們提供了基於註解的依賴注入和基於java的配置。從Spring 2.5開始引入了基於註釋的依賴注入,它自動掃描並註冊類做爲使用註釋的Spring bean@Component註釋。java

這意味着不使用 標記該聲明bean 並注入依賴項,它將由Spring自動完成。使用<context:component-scan>標記啓用和禁用此功能。web

如今已經知道了@Component註釋的做用,讓咱們看看@Service、@Controller和@Repository註釋的做用。面試

它們只是特定狀況下@Component註釋的特殊形式。咱們沒有在Spring MVC的控制器類上使用@Component,而是使用@Controller,這樣可讀性更好,也更合適。spring

經過使用該註釋,咱們作了兩件事,首先咱們聲明這個類是一個Spring bean,應該由Spring ApplicationContext建立和維護,但咱們也指出它是MVC設置中的控制器。後一個屬性被特定於web的工具和功能所使用。app

例如,DispatcherServlet將在使用@Controller而不是@Component註釋的類上尋找@RequestMapping。框架

這意味着@Component和@Controller在bean建立和依賴注入方面是相同的,但後者是前者的一種特殊形式。若是將@Controller註釋替換爲@Compoenent, Spring也能夠自動檢測並註冊控制器類,但它在請求映射方面可能沒法正常工做。工具


@Service和@Repository註釋也是如此。它們是服務和持久層中@Component的特化。服務層中的Spring bean應使用@Service而不是@Component進行註釋,且持久層中的spring bean應使用@Repository進行註釋。post

經過使用專門的註釋,咱們能夠一箭雙鵰。首先,它們被視爲Spring bean,其次,能夠放置​​該層所需的特殊行爲。學習

例如,@Repository不只在基於註釋的配置中提供了幫助,並且還捕獲了平臺特定的異常,並將其做爲Spring統一的未檢查異常從新拋出。spa

爲此,還須要將org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor聲明爲Spring bean。

這個bean post處理器將一個advisor添加到帶有@Repository註解的任何bean中,以便捕獲平臺特定的異常,而後做爲Spring未檢查的數據訪問異常從新拋出。

這也是Spring面試中常見的問題之一,也是Spring認證的一個流行概念。

Component Scanning如何在Spring中運行?
從Spring 2.0開始,Spring提供了 <context:component-scan> 和註釋驅動,來自動檢測和註冊Spring bean,而不是在XML文件中指定它們。

可是,它只掃描@Component而且通常不會查找@ Controller,@ Service和@Repository。它們被掃描,由於它們自己是用@Component註釋的。

只需看看@ Controller,@ Service和@Repository註釋定義:


所以,說@Controller、@Service和@Repository是特殊類型的@Component註釋並無錯。context:component-scan>將它們收集起來,並將它們下面的類註冊爲bean,就像用@Component註釋它們同樣。

掃描它們,是由於它們自己都使用@Component註釋進行註釋。若是你定義本身的自定義註釋並使用@Component註釋它,那麼它也將使用 <context:component-scan>進行掃描。


摘要
下面是對@Component、@Service、@Controller和@Repository註釋在Spring框架中的做用作的總結:

@Component是任何spring管理的組件或bean的通用構造型。

@Repository是持久層的構造型。

@Service是服務層的構造型。

Controller是表示層(spring-MVC)的構造型。

下圖很好的解釋Spring Framework中全部這些註釋的層次結構:

Spring中Component、Service、Controller和Repository之間的區別
這就是Spring框架中@Component、@Controller、@Service和@Repository之間的區別。正如我所說,當啓用上下文掃描時,它們都用於自動檢測Spring bean,而且在依賴項注入方面提供了基本相同的功能。且本質上提供了與依賴注入相同的功能。

它們惟一的不一樣之處在於它們的用途,即在Spring MVC中使用@Controller來定義controller,首先是Spring bean,而後是controller。一樣,@Service用於在服務層中保存業務邏輯的註釋類,而@Repository用於數據訪問層。

相關文章
相關標籤/搜索