@Component, @Repository, @Service的區別
@Component, @Repository, @Service的區別
官網引用
引用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 {...}
- 1
- 2
- 3
這樣,所有被@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
層是業務邏輯層註解,這個註解只是標註該類處於業務邏輯層。
用這些註解對應用進行分層之後,就能將請求處理,義務邏輯處理,資料庫操作處理分離出來,為程式碼解耦,也方便了以後專案的維護和開發。
相關文章
- @Component和@Repository、@Service、@ControllerController
- SpringMVC常用註解@Controller,@Service,@repository,@ComponentSpringMVCController
- SpringBoot入門教程(十七)@Service、@Controller、@Repository、@ComponentSpring BootController
- @Component和@Bean的區別Bean
- service和systemctl的區別
- @Bean和@Component之間的區別?Bean
- React.createClass和extends Component的區別React
- DAO和Repository有什麼區別
- @Resource 與 @Service註解的區別
- Service Worker Cache 和 HTTP Cache 的區別HTTP
- WebSphere Service Registry and Repository API 簡介WebAPI
- Spring中@Component和@Configuration的區別Spring
- WebSphere Service Registry and Repository 外掛的功能及使用Web
- Laravel 設計模式:Repository + Service 實戰Laravel設計模式
- Windows Service:SC 和 InstallUtil 區別Windows
- @Configuration與@Component作為配置類的區別
- 轉android-Service和Thread的區別Androidthread
- oracle中service_name區別總結Oracle
- MVC下的DAO介面類和SERVICE介面類區別?MVC
- systemctl的操作詳解總結及其與service的區別
- 內建系統賬戶:Local system/Network service/Local Service 區別
- WCF、Web API、WCF REST、Web Service之區別WebAPIREST
- WCF、Net remoting、Web service概念及區別REMWeb
- service會不會因repository而變得也很薄
- Spring security (一)架構框架-Component、Service、Filter分析Spring架構框架Filter
- Oracle SID和Service_Name有什麼區別?Oracle
- db_name,db_domain, global_name, service_name的區別AI
- 使用WebSphere Service Registry and Repository 作為DB2 pureXML模式的主登錄檔WebDB2XML模式
- 理解AngularJS中的Service型別AngularJS型別
- annotation之context:annotation-config與 context:component-scan的區別與聯絡Context
- DB_NAME、DB_UNIQUE_NAME、SERVICE_NAME和INSTANCE_NAME等的區別
- Oracle中DB_NAME,SID,DB_DOMAIN,SERVICE_NAME等之間的區別OracleAI
- 什麼是@Component,@Component的作用是什麼
- repository 模式的小解模式
- 對Repository的疑惑
- service型別及功能簡介+pod型別型別
- no such repository
- ??與?:的區別