java - service用法 - springframework @component




Spring中的@Component,@Repository和@Service註釋有什麼區別? (17)

@Repository @Component@Repository@Service註釋可以在Spring中互換使用,還是除了充當符號設備外,還可以提供任何特定的功能嗎?

換句話說,如果我有一個Service類並將@Service的註釋更改為@Component ,它的行為是否仍然相同?

或者註釋是否也會影響課堂的行為和功能?


Spring 2.5引入了更多的構造型註釋:@Component,@Service和@Controller。 @Component是任何Spring管理組件的通用構造型; 而@Repository,@Service和@Controller作為@Component的特化,用於更具體的用例(例如,分別在持久層,服務層和表示層中)。 這意味著你可以用@Component註釋你的組件類,但是通過用@Repository,@Service或@Controller註釋它們,你的類更適合用工具進行處理或者與方面相關聯。 例如,這些刻板印象註解是切入點的理想目標。 當然,@Repository,@Service和@Controller也可能在Spring Framework的未來發行版中攜帶額外的語義。 因此,如果您在為您的服務層使用@Component或@Service之間做出決定,@Service顯然是更好的選擇。 同樣,如上所述,已經支持@Repository作為持久層自動異常轉換的標記。

@Component – Indicates a auto scan component.
@Repository – Indicates DAO component in the persistence layer.
@Service – Indicates a Service component in the business layer.
@Controller – Indicates a controller component in the presentation layer.

參考: - Spring Documentation - 類路徑掃描,託管組件和使用Java編寫配置


@ Component,@ Service,@ Controller和@ Repository之間沒有區別。 @Component是表示我們MVC組件的通用註釋。 但是會有幾個組件作為MVC應用程序的一部分,如服務層組件,持久層組件和表示層組件。 所以為了區分他們春天人們也給了其他三個註釋。

表示持久層組件:@Repository

表示服務層組件:@Service

表示表示層組件:@Controller

否則你可以使用@Component來處理它們。


Spring @Component @Service@Repository @Controller@Repository@Controller註釋用於在Spring框架中使用類路徑掃描進行自動Bean檢測。

@Component是一個通用的註釋。 @Repository @Controller@Repository@Controller@Component區別在於它們是@Component的特殊情況,用於特定目的。 區別僅僅是分類。

對於所有這些註釋(刻板印象),技術上核心目的是相同的。 Spring會自動掃描並標識所有這些用“ @Component @Service@Repository @Controller@Repository@Controller ”註解的@Component ,並使用ApplicationContext註冊Bean Definition。


Spring提供了四種不同類型的自動組件掃描註釋,它們是@Component Component, @Repository @Controller@Repository@Controller 。 從技術上講,它們之間沒有區別,但是每個汽車零部件掃描註釋都應該用於特定目的,並且在定義的圖層中使用。

@Component :這是一個基本的自動組件掃描註釋,它表示帶註釋的類是一個自動掃描組件。

@Controller :帶註釋的類表示它是一個控制器組件,主要用於表示層。

@Service :它表示帶註釋的類是業務層中的Service組件。

@Repository :您需要在持久層中使用此註釋,這就像數據庫存儲庫一樣。

在批註他們的類時,應該選擇更具體的@Component形式,因為此註釋可能包含未來的特定行為。


@Component : you annotate a class @Component, it tells hibernate that it is a Bean.

@Repository : you annotate a class @Repository, it tells hibernate it is a DAO class and treat it as DAO class. Means it makes the unchecked exceptions (thrown from DAO methods) eligible for translation into Spring DataAccessException.

@Service : This tells hibernate it is a Service class where you will have @Transactional etc Service layer annotations so hibernate treats it as a Service component.

Plus @Service is advance of @Component. Assume the bean class name is CustomerService, since you did not choose XML bean configuration way so you annotated the bean with @Component to indicate it as a Bean. So while getting the bean object CustomerService cust = (CustomerService)context.getBean("customerService"); By default, Spring will lower case the first character of the component – from 'CustomerService' to 'customerService'. And you can retrieve this component with name 'customerService'. But if you use @Service annotation for the bean class you can provide a specific bean name by

@Service("AAA")
public class CustomerService{

and you can get the bean object by

CustomerService cust = (CustomerService)context.getBean("AAA");

@Component,@Service和@Repository之間的區別

這些刻板印象之間的主要區別在於它們被用於不同的分類。

在一個多層應用程序中,我們將有不同的層次,如演示文稿,服務,業務,數據訪問等。當一個類將被Spring註釋為自動檢測時,那麼我們應該使用各自的構造型如下。

@Component - 通用的,可以跨應用程序使用。
@Service - 在服務層級別註釋類。
@Repository - 在持久層註釋類,它將充當數據庫存儲庫。

如果技術上他們會一樣,那麼為什麼我們需要在不同的層次上使用這些。 為什麼不在所有圖層上使用相同的圖層。 例如,如果我們在所有圖層中使用@Service ,則所有的bean都將被實例化並且沒有問題。 有一個小小的區別,例如考慮@Repository

後處理程序會自動查找所有異常轉換器(PersistenceExceptionTranslator接口的實現)並建議所有標記有@Repository註釋的bean,以便發現的轉換器可以攔截並應用所拋出異常的適當轉換。

與上麵類似,未來Spring可能會根據分層約定為@Service @Controller@Repository @Controller@Repository添加值。 為了達到這個附加的功能優勢,它更好地遵守約定,並將它們與層次結合使用。

除上述以外,就掃描自動檢測而言,BeanDefinition @Component @Service@Repository @Controller@Repository@Controller Controller的依賴注入是相同的。


Explanation of stereotypes :

  • @Service - Annotate all your service classes with @Service. This layer knows the unit of work. All your business logic will be in Service classes. Generally methods of service layer are covered under transaction. You can make multiple DAO calls from service method, if one transaction fails all transactions should rollback.
  • @Repository - Annotate all your DAO classes with @Repository. All your database access logic should be in DAO classes.
  • @Component - Annotate your other components (for example REST resource classes) with component stereotype.
  • @Autowired - Let Spring auto-wire other beans into your classes using @Autowired annotation.

@Component是任何Spring管理組件的通用原型。@Repository@Service並且@Controller@Component更具體的用例的專門化,例如,分別在持久性,服務和表示層中。

最初here回答。


A @Service to quote spring documentation,

Indicates that an annotated class is a "Service", originally defined by Domain-Driven Design (Evans, 2003) as "an operation offered as an interface that stands alone in the model, with no encapsulated state." May also indicate that a class is a "Business Service Facade" (in the Core J2EE patterns sense), or something similar. This annotation is a general-purpose stereotype and individual teams may narrow their semantics and use as appropriate.

If you look at domain driven design by eric evans,

A SERVICE is an operation offered as an interface that stands alone in the model, without encapsulating state, as ENTITIES and VALUE OBJECTS do. SERVICES are a common pattern in technical frameworks, but they can also apply in the domain layer. The name service emphasizes the relationship with other objects. Unlike ENTITIES and VALUE OBJECTS, it is defined purely in terms of what it can do for a client. A SERVICE tends to be named for an activity, rather than an entity—a verb rather than a noun. A SERVICE can still have an abstract, intentional definition; it just has a different flavor than the definition of an object. A SERVICE should still have a defined responsibility, and that responsibility and the interface fulfilling it should be defined as part of the domain model. Operation names should come from the UBIQUITOUS LANGUAGE or be introduced into it. Parameters and results should be domain objects. SERVICES should be used judiciously and not allowed to strip the ENTITIES and VALUE OBJECTS of all their behavior. But when an operation is actually an important domain concept, a SERVICE forms a natural part of a MODEL-DRIVEN DESIGN. Declared in the model as a SERVICE, rather than as a phony object that doesn't actually represent anything, the standalone operation will not mislead anyone.

and a Repository as per Eric Evans,

A REPOSITORY represents all objects of a certain type as a conceptual set (usually emulated). It acts like a collection, except with more elaborate querying capability. Objects of the appropriate type are added and removed, and the machinery behind the REPOSITORY inserts them or deletes them from the database. This definition gathers a cohesive set of responsibilities for providing access to the roots of AGGREGATES from early life cycle through the end.


即使我們交換@Component或@Repository或@service

它的行為是一樣的,但一個方面是,如果我們使用component或@ service,他們將無法捕獲與DAO相關的特定異常,而不是存儲庫


在Spring @Component@Service @Controller@Repository @Controller@Repository是Stereotype註釋,用於:

@Controller:你的請求 映射從演示文稿頁面完成,即表示層不會轉到任何其他文件,它將直接轉到@Controller類,並在必要時在方法調用之前編寫的@RequestMapping註釋中檢查請求的路徑。

@Service :所有業務邏輯都在這裡,即數據相關的計算和所有。這是業務層的註釋,我們的用戶不直接調用持久化方法,所以它會使用這個註解調用這個方法。 它將根據用戶請求請求@Repository

@Repository :這是用於從數據庫獲取數據的應用程序的持久層(數據訪問層)。 即所有與數據庫相關的操作都由存儲庫完成。

@Component - 用組件原型註釋其他組件(例如REST資源類)。

表示註釋類是“ component ”。 當使用基於註釋的配置和類路徑掃描時,這些類被認為是自動檢測的候選對象。

其他類級別的註釋也可以被視為標識組件,通常是一種特殊的組件:例如@Repository註釋或AspectJ's @Aspect註釋。

component


在春季4,最新版本:

@Repository註釋是任何實現存儲庫(也稱為數據訪問對像或DAO)角色或構造型的類的標記。 該標記的用途是自動翻譯異常,如第20.2.2節“異常翻譯”中所述。

Spring提供了更多的構造型註釋:@Component,@Service和@Controller。 @Component是任何Spring管理組件的通用構造型。 對於更具體的用例,@Repository,@Service和@Controller是@Component的特化,例如,分別在持久層,服務和表示層中。 因此,您可以使用@Component註釋您的組件類,但通過使用@Repository,@Service或@Controller註釋它們,您的類更適合通過工具進行處理或與方面相關聯。 例如,這些刻板印象註解為切入點提供了理想的目標。 @Repository,@Service和@Controller也可能在Spring Framework的未來版本中攜帶額外的語義。 因此,如果您在為服務層使用@Component或@Service之間進行選擇,@Service顯然是更好的選擇。 同樣,如上所述,已經支持@Repository作為持久層自動異常轉換的標記。


它們幾乎是一樣的 - 它們都意味著這個類是一個Spring bean。 @Service @Controller@Repository@Controller是專用的@Component 。 您可以選擇執行特定的操作。 例如:

  • @Controller bean被spring-mvc使用
  • @Repository bean有資格進行持久性異常轉換

另一件事是你指定組件在語義上不同的層。

@Component提供的一件事是您可以使用它註釋其他註釋,然後以與@Service相同的方式使用它們。

例如最近我做了:

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

所以所有使用@ScheduledJob註解的類都是spring bean,除此之外,它們@ScheduledJob註冊為石英作業。 您只需提供處理特定註釋的代碼。


從數據庫連接的角度來看,使用@Service@Repository註釋非常重要。

  1. 對所有Web服務類型的數據庫連接使用@Service
  2. 對所有存儲的proc數據庫連接使用@Repository

如果您沒有使用正確的註釋,則可能會面臨由回滾事務覆蓋的提交異常。 在壓力負載測試期間,您會看到與回滾JDBC事務相關的異常。


我們可以根據java標準回答這個問題

參考Spring現在支持的JSR-330 ,你只能使用@Named來定義一個bean(一些how @[email protected] )。 所以根據這個標準,似乎沒有必要定義立體聲類型(比如@Repository@Service @Repository@Service @Controller )來分類bean。

但是,春季用戶將這些不同的註釋用於特定用途,例如:

  1. 幫助開發人員為主管人員定義更好的類別。 這種分類在某些情況下可能會有所幫助。 (例如,當您使用aspect oriented ,這些可能是point cuts好選擇)
  2. @Repository註釋會為你的bean增加一些功能(一些自動異常轉換到你的bean持久層)。
  3. 如果您使用的是spring mvc,則@RequestMapping只能添加到由@Controller註釋的類中。

技術上@Controller,@Service和@Repository都是一樣的。 所有這些擴展@Components。

源自Spring源代碼:

表示註釋類是“組件”。 當使用基於註釋的配置和類路徑掃描時,這些類被認為是自動檢測的候選對象。

我們可以直接為每個bean使用@Component,但為了更好地理解和維護大型應用程序,我們使用@Controller,@Service和@Repository。

每個註釋的目的:

1)@Controller - >用這個註解的類,旨在接收來自客戶端的請求。 First request comes to the Dispatcher Servlet, from where it passes the request to the particular controller using value of @RequestMapping annotation.

2) @Service -> Classes annotated with this, are intended to manipulate data, that we receive from client or fetch from database. All the manipulation with data should be done in this layer.

3) @Repository -> Classes annotated with this, are intended to connect with database. It can also be considered as DAO(Data access Object) layer. This layer should be restricted to CRUD (create,retrieve,update,delete) operations only. If any manipulation is required, data should be send be send back to @Service layer.

If we interchange their place(use @Repository in place of @Controller), our application will work fine.

The main purpose of using three different @annotations is to provide better Modularity to the Enterprise application.


由於許多答案已經說明了這些註釋的用途,我們在這裡將重點討論它們之間的一些細微差別。

首先是相似性

值得再次強調的一點是, 對於BeanDefinition的掃描自動檢測和依賴注入,所有這些註釋(即@Component,@Service,@ Repository,@Controller)都是相同的。 我們可以用一個替代另一個,仍然可以解決問題。

@Component,@Repository,@Controller和@Service之間的差異

@零件

這是一個通用的構造型註釋,指示該類是一個彈簧組件。

@Component有什麼特別之處
<context:component-scan>僅掃描@Component ,通常不會查找@Controller@Service @Controller@Repository 。 他們被掃描,因為他們自己用@Component註釋。

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

@Component
public @interface Service {
    ….
}

@Component
public @interface Repository {
    ….
}

@Component
public @interface Controller {
    …
}

因此,說@Controller@Service @Controller@Repository@Component註釋的特殊類型是沒有錯的。 <context:component-scan>選取它們並將它們的以下類註冊為bean,就像它們使用@Component註釋一樣。

他們被掃描,因為他們自己被@Component註釋註釋。 如果我們定義我們自己的自定義註釋並使用@Component註釋它,那麼它也將使用<context:component-scan>

@Repository

這表示該類定義了一個數據存儲庫。

@Repository有什麼特別之處?

除了指出這是一個基於註解的配置之外@Repository的工作是捕獲特定於平台的異常,並將它們重新引用為Spring的統一非檢查異常。 為此,我們提供了PersistenceExceptionTranslationPostProcessor ,我們需要在Spring的應用程序上下文中添加如下內容:

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

這個bean後期處理器將一個顧問程序添加到任何使用@Repository註釋的bean中,以便捕獲任何特定於平台的異常,然後重新將其作為Spring未經檢查的數據訪問異常之一。

@Controller

@Controller註釋表示特定的類用作控制器的角色。 @Controller批註充當註釋類的刻板印象,表明其作用。

@Controller有什麼特別之處?

我們無法使用任何其他類似@Service@Repository來切換此註釋,即使它們看起來相同。 調度程序掃描用@Controller註釋的類並檢測其中的@RequestMapping註釋。 我們只能在@Controller註釋類上使用@RequestMapping

@服務

@Services在倉庫層中保存業務邏輯和調用方法。

@Service有什麼特別之處?

除了它用來表明它擁有業務邏輯的事實之外,這個註釋並沒有明顯的特點,但是誰知道呢,spring可能會在未來增加一些額外的特性。

還有什麼?

與上麵類似,未來Spring可能會根據分層約定為@Service @Controller@Repository @Controller@Repository添加特殊功能。 因此,尊重公約並將其與層次結合使用始終是一個好主意。


@Component – Indicates a auto scan component.  
@Repository – Indicates DAO component in the persistence layer.  
@Service – Indicates a Service component in the business layer.   
@Controller – Indicates a controller component in the presentation layer.  

您會注意到所有@Repository@Service @Controller@Controller都使用@Component進行了註釋。 那麼,我們可以只使用@Component來進行自動掃描的所有組件嗎? 是的,你可以,Spring將自動掃描所有你的組件帶有註解的@Component。

它工作正常,但不是一個好的做法,為了可讀性,您應該始終為指定圖層聲明@Repository@Service @Controller@Controller ,以使您的代碼更易於閱讀。







annotations