Springの@ Component、@ Repository、@ Serviceアノテーションの違いは何ですか?

2185
Colin McCree 2011-07-26 23:10.

@Component@Repositoryおよび@Service注釈はSpringで交換可能に使用できますか、それとも注釈デバイスとして機能する以外に特定の機能を提供しますか?

言い換えれば、私はServiceクラスを持っていると私はからの注釈を変更した場合@Service@Component、それはまだ同じように動作しますか、?

または、注釈はクラスの動作と機能にも影響しますか?

28 answers

1571
stivlo 2011-08-02 00:20.

Springドキュメントから:

@Repository注釈は、(また、データアクセスオブジェクトまたはDAOとしても知られる)リポジトリの役割またはステレオタイプを満たす任意のクラスのマーカーです。このマーカーの用途の中には、例外の翻訳で説明されているように、例外の自動翻訳があります。

春はさらにステレオタイプのアノテーションを提供します@Component@Service@Controller@ComponentSpringで管理されるコンポーネントの一般的なステレオタイプです。@Repository@Service、および@Controllerの特殊化されている@Component(それぞれ、持続性、サービス、およびプレゼンテーションの層)より具体的なユースケースのために。したがって、コンポーネントクラスに@Component、で注釈を付けることができますが、、、、または代わりに注釈を付けることで@Repository、クラスはツールによる処理やアスペクトへの関連付けにより適しています。@Service@Controller

たとえば、これらのステレオタイプアノテーションは、ポイントカットの理想的なターゲットになります。@Repository@Service、そして@Controllerまた春のフレームワークの将来のリリースで追加のセマンティクスを運ぶことができます。したがって、サービスレイヤーを使用する@Component@Service、サービスレイヤーに使用するかを選択する場合は、@Service明らかに優れた選択肢です。同様に、前述のように、@Repository永続層での自動例外変換のマーカーとしてすでにサポートされています。

┌──────────────┬─────────────────────────────────────────────────────┐
│ Annotation   │ Meaning                                             │
├──────────────┼─────────────────────────────────────────────────────┤
│  @Component  │ generic stereotype for any Spring-managed component │
│  @Repository │ stereotype for persistence layer                    │
│  @Service    │ stereotype for service layer                        │
│  @Controller │ stereotype for presentation layer (spring-mvc)      │
└──────────────┴─────────────────────────────────────────────────────┘
841
Raman Sahasi 2016-07-24 20:43.

回答の多くはすでにこれらの注釈が何に使用されるかを述べているので、ここではそれらの間のいくつかの小さな違いに焦点を当てます。

最初の類似性

もう一度強調する価値のある最初のポイントは、BeanDefinitionのスキャン自動検出と依存性注入に関して、これらすべてのアノテーション(つまり、@ Component、@ Service、@ Repository、@ Controller)が同じであるということです。あるものを別のものの代わりに使用することができ、それでも回避することができます。


@ Component、@ Repository、@ Controller、@ Serviceの違い

@成分

これは、クラスがスプリングコンポーネントであることを示す汎用ステレオタイプアノテーションです。

@Componentについて何が特別に
<context:component-scan>のみスキャン@Componentして探していない@Controller@Service@Repository一般に呼ばれることがあります。それら自体に@Component。の注釈が付けられているため、スキャンされます。

ただ、見て取り@Controller@Serviceおよび@Repository注釈の定義を:

@Component
public @interface Service {
    ….
}

 

@Component
public @interface Repository {
    ….
}

 

@Component
public @interface Controller {
    …
}

したがって、、は特殊なタイプの注釈@Controllerである@Serviceと言うのは間違いではありません。それらをピックアップし、次のクラスをBeanとして登録します。これは、注釈が付けられているかのように行われます。@Repository@Component<context:component-scan>@Component

特殊なタイプの注釈もスキャンされます。@Componentこれは、それら自体に注釈が付けられているため@Componentです。つまり、それらもsです。独自のカスタムアノテーションを定義し、でアノテーションを付けると@Component、次のようにスキャンされます。<context:component-scan>


@Repository

これは、クラスがデータリポジトリを定義していることを示します。

@Repositoryの何が特別なのですか?

これがアノテーションベースの構成であることを指摘することに加えて、@Repositoryの仕事は、プラットフォーム固有の例外をキャッチし、Springの統合されたチェックされていない例外の1つとしてそれらを再スローすることです。このために、次のPersistenceExceptionTranslationPostProcessorようにSpringのアプリケーションコンテキストに追加する必要があるが提供されます。

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

このBeanポストプロセッサは、注釈が付けられたBeanにアドバイザを追加し@Repositoryて、プラットフォーム固有の例外がキャッチされ、Springの未チェックのデータアクセス例外の1つとして再スローされるようにします。


@コントローラ

@Controller注釈は、特定のクラスは、コントローラの役割を果たしていることを示しています。@Controller注釈は、その役割を示し、注釈付きクラスのステレオタイプとして機能します。

@Controllerの何が特別なのですか?

同じように見えても、このアノテーションを他のlike@Service@Repository、と切り替えることはできません。ディスパッチャは、アノテーションが付けられたクラスをスキャンし、その中にアノテーションが@Controller付けられたメソッドを検出@RequestMappingします。我々は使用することができ@RequestMapping、そのクラスでアノテートされているメソッドのみに/上@Controller、それが意志しないと仕事@Component@Service@Repository等...

注:クラスが既に等を介して、任意の別の方法を介してBeanとして登録されている場合@Bean、またはを通じて@Component@Service等...注釈は、その後、@RequestMappingクラスもで注釈された場合に取り出すことができる@RequestMapping注釈。しかし、それは別のシナリオです。


@サービス

@Service Beanは、リポジトリ層でビジネスロジックと呼び出しメソッドを保持します。

@Serviceの何が特別なのですか?

ビジネスロジックを保持していることを示すために使用されているという事実を除けば、この注釈には他に目立つものはありません。しかし、誰が知っているか、Springは将来いくつかの例外を追加するかもしれません。


ほかに何か?

将来的には、上記と同様に春はのための特別な機能を追加でき@Service@Controllerそして@Repositoryその階層化規則に基づきます。したがって、規則を尊重し、レイヤーに沿って使用することをお勧めします。

439
Bozho 2011-07-26 23:16.

それらはほとんど同じです-それらのすべては、クラスが春の豆であることを意味します。@Service@Repositoryおよび@Controllerは専門@Componentです。それらを使用して特定のアクションを実行することを選択できます。例えば:

  • @Controller Beansはspring-mvcで使用されます
  • @Repository Beanは永続性例外変換の対象です

もう1つのことは、コンポーネントを意味的に異なるレイヤーに指定することです。

@Component提供されることの1つは、他の注釈に注釈を付けて、と同じように使用できること@Serviceです。

たとえば、最近私が作ったもの:

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

したがって、注釈が付けられたすべてのクラスはSpring @ScheduledJobBeanであり、それに加えてクォーツジョブとして登録されます。特定のアノテーションを処理するコードを提供する必要があります。

390
Oliver 2014-05-23 19:15.

@Componentはと同等です

<bean>

@ Service、@ Controller、@ Repository = {@ Component +いくつかの特別な機能}

つまり、サービス、コントローラー、リポジトリは機能的に同じです。

3つのアノテーションは、アプリケーションの「レイヤー」を区切るために使用されます。

  • コントローラーは、ディスパッチ、転送、サービスメソッドの呼び出しなどを実行します。
  • サービスホールドビジネスロジック、計算など。
  • リポジトリはDAO(データアクセスオブジェクト)であり、データベースに直接アクセスします。

ここで、なぜそれらを分離するのかと疑問に思うかもしれません:(私はあなたがAOPアスペクト指向プログラミングを知っていると思います)

DAOレイヤーのアクティビティのみを監視するとします。DAOのすべてのメソッドが呼び出される前後にいくつかのロギングを行うアスペクト(Aクラス)クラスを作成します。3つの異なるレイヤーがあり、混合されていないため、AOPを使用してそれを行うことができます。

したがって、DAOメソッドの「前後」、「前」、または「後」のDAOのロギングを行うことができます。そもそもDAOがあったので、それが可能でした。あなたが今達成したのは、関心の分離またはタスクです。

@Controllerアノテーションが1つしかない場合、このコンポーネントにはディスパッチ、ビジネスロジック、データベースへのアクセスがすべて混在しているため、コードがダーティであると想像してください。

上記は非常に一般的なシナリオの1つであり、3つのアノテーションを使用する理由のユースケースは他にもたくさんあります。

228
Harshal Patil 2014-03-25 22:00.

春には@Component@Service@Controller、および@Repositoryステレオタイプの注釈に使用されています。

@Controller:あなたの場所をリクエスト プレゼンテーションページからマッピング行わつまりプレゼンテーション層は、他のファイルに行くことはありません、それは直接行く@Controllerで要求されたパスのクラスをチェック@RequestMapping、必要に応じてメソッド呼び出しの前に書かれた注釈。

@Service:すべてのビジネスロジック、つまりデータ関連の計算とすべてがここにあります。ユーザーが永続メソッドを直接呼び出さないため、このアノテーションを使用してこのメ​​ソッドを呼び出すビジネスレイヤーのこのアノテーション。ユーザーの要求に従って@Repositoryを要求します

@Repository:これは、データベースからデータを取得するために使用されたアプリケーションの永続層(データアクセス層)です。つまり、データベース関連のすべての操作はリポジトリによって実行されます。

@Component -他のコンポーネント(RESTリソースクラスなど)にコンポーネントステレオタイプで注釈を付けます。

注釈付きクラスが「コンポーネント」であることを示します。このようなクラスは、注釈ベースの構成とクラスパススキャンを使用する場合、自動検出の候補と見なされます。

他のクラスレベルのアノテーションも、コンポーネント、通常は特別な種類のコンポーネントを識別するものと見なすことができます。たとえば、@ RepositoryアノテーションやAspectJの@Aspectアノテーションなどです。

75
Ajit Singh 2013-05-16 02:48.

Spring 2.5では、@ Component、@ Service、@ Controllerというステレオタイプアノテーションがさらに導入されています。@Componentは、Springが管理するコンポーネントの一般的なステレオタイプとして機能します。一方、@ Repository、@ Service、および@Controllerは、より具体的な使用例(たとえば、それぞれ永続性、サービス、およびプレゼンテーション層)のための@Componentの特殊化として機能します。つまり、コンポーネントクラスに@Componentアノテーションを付けることができますが、代わりに@ Repository、@ Service、または@Controllerでアノテーションを付けることで、クラスはツールによる処理やアスペクトへの関連付けにより適しています。たとえば、これらのステレオタイプアノテーションは、ポイントカットの理想的なターゲットになります。もちろん、@ Repository、@ Service、および@ControllerがSpringFrameworkの将来のリリースで追加のセマンティクスを実行する可能性もあります。したがって、サービスレイヤーに@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ドキュメント-クラスパススキャン、マネージドコンポーネント、Javaを使用した構成の記述

50
YogendraR 2017-07-28 00:20.

技術的@Controller@Serviceは、、@Repositoryはすべて同じです。それらのすべてが拡張され@Componentます。

Springのソースコードから:

注釈付きクラスが「コンポーネント」であることを示します。このようなクラスは、注釈ベースの構成とクラスパススキャンを使用する場合、自動検出の候補と見なされます。

私たちは、直接使用することができ@Component、我々が使用し、それぞれ、すべてのBeanのが、大きなアプリケーションの理解と保守性のために@Controller@Service@Repository

各注釈の目的:

  1. @Controller->これで注釈が付けられたクラスは、クライアント側から要求を受け取ることを目的としています。最初のリクエストはディスパッチャサーブレットに送信され、そこから@RequestMappingアノテーションの値を使用して特定のコントローラにリクエストが渡されます。
  2. @Service->これで注釈が付けられたクラスは、クライアントから受信したり、データベースからフェッチしたりするデータを操作することを目的としています。データを使用したすべての操作は、このレイヤーで実行する必要があります。
  3. @Repository->これで注釈が付けられたクラスは、データベースに接続することを目的としています。DAO(データアクセスオブジェクト)レイヤーと見なすこともできます。このレイヤーは、CRUD(作成、取得、更新、削除)操作のみに制限する必要があります。操作が必要な場合は、データを@Serviceレイヤーに送り返す必要があります。

それらの場所を交換すると(の@Repository代わりに使用@Controller)、アプリケーションは正常に機能します。

3つの異なるものを使用する主な目的は@annotations、エンタープライズアプリケーションにより良いモジュール性を提供することです。

49
Das 2012-11-03 06:05.

データベース接続の観点から@Service@Repository注釈の使用と注釈は重要です。

  1. @ServiceすべてのWebサービスタイプのDB接続に使用します
  2. @RepositoryストアドプロシージャDB接続すべてに使用

適切なアノテーションを使用しないと、ロールバックトランザクションによってオーバーライドされるコミット例外に直面する可能性があります。JDBCトランザクションのロールバックに関連するストレス負荷テスト中に例外が表示されます。

29
atish shimpi 2014-07-19 01:23.

@Repository @Service@Controllerは、@ Componentの特殊化として機能し、@ Serviceを@Componentに置き換えることができますが、この場合は特殊化が失われます。

1. **@Repository**   - Automatic exception translation in your persistence layer.
2. **@Service**      - It indicates that the annotated class is providing a business service to other layers within the application.
28
Anil Amane 2015-04-26 06:19.

これらの注釈はすべてステレオタイプのタイプの注釈であり、これら3つの注釈の違いは次のとおりです。

  • @Componentを追加すると、クラスの役割がコンポーネントクラスであることがわかります。つまり、何らかのロジックで構成されるクラスであることがわかりますが、特定のビジネスロジック、永続性ロジック、またはコントローラーロジックを含むクラスであるかどうかはわかりません。したがって、使用しません。この@Componentアノテーションを直接
  • @Serviceアノテーションを追加すると、ビジネスロジックで構成されるクラスの役割がわかります。
  • クラスの上に@Repositoryを追加すると、永続ロジックで構成されるクラスであることがわかります。
  • ここで、@ Componentは、@ Service、@ Repository、および@Controllerアノテーションの基本アノテーションです。

例えば

package com.spring.anno;
@Service
public class TestBean
{
    public void m1()
    {
       //business code
    }
}

package com.spring.anno;
@Repository
public class TestBean
{
    public void update()
    {
       //persistence code
    }
}
  • デフォルトで@Serviceorまたは@Repositroyor@Controllerアノテーションを追加するたびに、@Componentアノテーションはクラスの上に存在します
25
hardeep thakur 2016-01-03 19:10.

春には、自動コンポーネントスキャン注釈の4種類を提供し、それらは@Component@Service@Repository@Controller。技術的には、これらの間に違いはありませんが、すべての自動コンポーネントスキャンアノテーションは、特別な目的で、定義されたレイヤー内で使用する必要があります。

@Component:これは基本的な自動コンポーネントスキャンアノテーションであり、アノテーション付きクラスが自動スキャンコンポーネントであることを示します。

@Controller:注釈付きクラスは、それがコントローラーコンポーネントであり、主にプレゼンテーション層で使用されることを示します。

@Service:注釈付きクラスがビジネス層のサービスコンポーネントであることを示します。

@Repository:永続層内でこのアノテーションを使用する必要があります。これはデータベースリポジトリのように機能します。

@Componentこのアノテーションには今後特定の動作が含まれる可能性があるため、クラスにアノテーションを付ける際には、より特殊な形式を選択する必要があります。

21
Alireza Fattahi 2016-05-04 18:23.

Java標準に従ってこれに答えることができます

JSR-330現在Springでサポートされているを参照すると、@NamedBeanの定義にのみ使用できます(Somehow @[email protected])。この規格に準拠したので、(のようなステレオタイプを定義するためには使用がないことがあるようで@Repository@Service@Controllerカテゴリ豆には)。

ただし、Springユーザーは、特定の用途に応じて、これらのさまざまな注釈をさまざまに使用します。たとえば、次のようになります。

  1. 開発者が有能な人にとってより良いカテゴリーを定義するのを手伝ってください。この分類は、場合によっては役立つことがあります。(たとえば、を使用している場合aspect-oriented、これらはの適切な候補になる可能性がありますpointcuts
  2. @Repository アノテーションは、Beanにいくつかの機能を追加します(Bean永続レイヤーへの自動例外変換)。
  3. Spring MVCを使用している場合、@RequestMappingは注釈が付けられたクラスにのみ追加でき@Controllerます。
21
tech.yenduri 2015-11-26 19:10.

間に違いはありません@Component@Service@Controller@Repository@ComponentMVCのコンポーネントを表す汎用アノテーションです。ただし、MVCアプリケーションの一部として、サービス層コンポーネント、永続層コンポーネント、プレゼンテーション層コンポーネントなどのいくつかのコンポーネントがあります。したがって、それらを区別するために、Springの人々は他の3つの注釈も付けています。

  • 永続層コンポーネントを表すには: @Repository
  • サービスレイヤーコンポーネントを表すには: @Service
  • プレゼンテーション層コンポーネントを表すには: @Controller
  • または@Component、それらすべてに使用できます。
20
Anil Nivargi 2017-11-23 08:42.

他のコンポーネント(RESTリソースクラスなど)に@Componentアノテーションを付けます。

@Component
public class AdressComp{
    .......
    ...//some code here    
}

@Componentは、Springで管理されるコンポーネントの一般的なステレオタイプです。

@ Controller、@ Service、および@Repositoryは、特定のユースケース向けの@Componentの特殊化です。

春の@コンポーネント

19
Manjush 2014-02-11 08:21.

@Componentまたは@Repositoryまたは@serviceを交換しても

動作は同じですが、コンポーネントまたは@サービスを使用すると、リポジトリではなくDAOに関連する特定の例外をキャッチできないという側面があります。

18
Arun Raaj 2017-11-10 03:32.

@Component:クラス@Componentにアノテーションを付けると、それがBeanであることを休止状態に通知します。

@Repository:クラス@Repositoryにアノテーションを付けると、それがDAOクラスであることを休止状態に伝え、DAOクラスとして扱います。これは、チェックされていない例外(DAOメソッドからスローされた)をSpringへの変換に適格にすることを意味しますDataAccessException

@Service:これは、hibernateが@Transactionalサービスレイヤーアノテーションなどを持つサービスクラスであることを通知するため、hibernateはそれをサービスコンポーネントとして扱います。

プラス@Serviceはの進歩です@ComponentCustomerServiceXML Bean構成方法を選択しなかったため、Beanクラス名がであると想定します。これは、Beanに注釈を付けてBean@Componentとして示すためです。したがって、Beanオブジェクトの取得中、CustomerService cust = (CustomerService)context.getBean("customerService");デフォルトでは、Springはコンポーネントの最初の文字を小文字にします(「CustomerService」から「customerService」)。また、このコンポーネントは「customerService」という名前で取得できます。ただし@Service、Beanクラスにアノテーションを使用する場合は、次の方法で特定のBean名を指定できます。

@Service("AAA")
public class CustomerService{

そして、あなたは次の方法でBeanオブジェクトを取得できます。

CustomerService cust = (CustomerService)context.getBean("AAA");
15
Quan Nguyen 2016-06-20 23:30.

Spring 4では、最新バージョン:

@Repositoryアノテーションは、リポジトリ(データアクセスオブジェクトまたはDAOとも呼ばれます)の役割またはステレオタイプを満たすクラスのマーカーです。このマーカーの用途には、20.2.2項「例外の翻訳」で説明されている例外の自動翻訳があります。

Springはさらにステレオタイプアノテーションを提供します:@ Component、@ Service、および@Controller。@Componentは、Springが管理するコンポーネントの一般的なステレオタイプです。@ Repository、@ Service、および@Controllerは、それぞれ永続層、サービス層、プレゼンテーション層など、より具体的なユースケース向けの@Componentの特殊化です。したがって、コンポーネントクラスに@Componentアノテーションを付けることができますが、代わりに@ Repository、@ Service、または@Controllerでアノテーションを付けることにより、クラスはツールによる処理やアスペクトへの関連付けにより適しています。たとえば、これらのステレオタイプアノテーションは、ポイントカットの理想的なターゲットになります。@ Repository、@ Service、および@Controllerは、SpringFrameworkの将来のリリースで追加のセマンティクスを実行する可能性もあります。したがって、サービスレイヤーに@Componentまたは@Serviceのどちらを使用するかを選択する場合は、@ Serviceの方が明らかに適しています。同様に、前述のように、@ Repositoryは、永続層での自動例外変換のマーカーとしてすでにサポートされています。

13
Amol Dixit 2016-12-21 23:12.

@Component は、注釈付きBeanをスキャンしてDIコンテナで使用できるようにする最上位の汎用注釈です。

@Repository は特殊な注釈であり、DAOクラスからのすべてのチェックされていない例外を変換する機能をもたらします

@Service特殊な注釈です。現在のところ、新しい機能はありませんが、Beanの意図が明確になっています。

@Controllerは、Bean MVCを認識させ、そのような@RequestMappingすべてのアノテーションをさらに使用できるようにする特殊なアノテーションです。

ここではより多くのです詳細は

12
Patel Romil 2019-07-04 21:22.

ここでは、コンポーネントリポジトリサービスアノテーション間の違いを説明するのに十分な答えがあります。違いを共有したい@Controller & @RestController

@Controller vs RestController

@RestController

  • この注釈は、の特殊なバージョンで@Controller追加された@Controller@ResponseBody自動的に注釈。したがって@ResponseBody、マッピングメソッドに追加する必要はありません。つまり、@ResponseBodyデフォルトでアクティブです。
  • を使用@RestControllerする場合、ビューを返すことはできません(ViewresolverSpring / Spring-Bootで使用することにより)
  • @RestControllerまた、応答をに変換JSON/XML automatically@ResponseBodyて、返されたオブジェクトを本体にある可能性のあるものに変換します。e.g. JSON or XML

@Controller

  • @ControllerクラスをSpringMVCコントローラーとしてマークするために使用されます。このアノテーションはの特殊なバージョンで@Componentあり、クラスパススキャンに基づいてコントローラークラスを自動検出できます。
  • @Controller Spring WebMVCでビューを返すことができます。

より詳細なビュー

11
Bharath 2016-12-28 22:18.

@Service春のドキュメントを引用するには、

注釈付きクラスが「サービス」であることを示します。元々はドメイン駆動設計(Evans、2003)によって、「カプセル化された状態ではなく、モデル内でスタンドアロンとして提供される操作」として定義されています。クラスが「ビジネスサービスファサード」(コアJ2EEパターンの意味で)または同様のものであることを示す場合もあります。この注釈は汎用のステレオタイプであり、個々のチームはセマンティクスを絞り込み、必要に応じて使用できます。

エリック・エバンスによるドメイン駆動設計を見ると、

SERVICEは、ENTITIESやVALUE OBJECTSのように、状態をカプセル化せずに、モデル内でスタンドアロンとして提供される操作です。SERVICESは、技術フレームワークの一般的なパターンですが、ドメインレイヤーにも適用できます。ネームサービスは、他のオブジェクトとの関係を強調します。ENTITIESやVALUEOBJECTSとは異なり、純粋にクライアントに対して何ができるかという観点から定義されています。SERVICEは、エンティティではなくアクティビティ、つまり名詞ではなく動詞にちなんで名付けられる傾向があります。SERVICEには、抽象的な意図的な定義を含めることができます。オブジェクトの定義とは異なるフレーバーを持っているだけです。SERVICEには引き続き定義された責任があり、その責任とそれを実行するインターフェースはドメインモデルの一部として定義されている必要があります。オペレーション名は、ユビキタス言語から取得するか、導入する必要があります。パラメータと結果はドメインオブジェクトである必要があります。サービスは慎重に使用する必要があり、エンティティと値オブジェクトからすべての動作を取り除くことは許可されません。しかし、操作が実際に重要なドメインコンセプトである場合、サービスはモデル駆動型設計の自然な部分を形成します。モデルで、実際には何も表さない偽のオブジェクトとしてではなく、SERVICEとして宣言されているため、スタンドアロン操作はだれにも誤解を与えることはありません。

そしてRepositoryエリック・エヴァンスのとおり、

REPOSITORYは、特定のタイプのすべてのオブジェクトを概念セット(通常はエミュレート)として表します。より複雑なクエリ機能を除いて、コレクションのように機能します。適切なタイプのオブジェクトが追加および削除され、REPOSITORYの背後にある機構がそれらをデータベースに挿入またはデータベースから削除します。この定義は、ライフサイクルの初期から終わりまで、AGGREGATESのルーツへのアクセスを提供するための一連のまとまりのある責任を集めています。

9
Maria Pomazkina-Karpikova 2018-10-03 16:32.

リポジトリサービスは、コンポーネントアノテーションの子です。したがって、それらはすべてコンポーネントです。リポジトリサービスはそれを拡張するだけです。どのくらい正確に?サービスにはイデオロギー的な違いしかありません。私たちはそれをサービスに使用します。リポジトリには特定の例外ハンドラがあります。

6
Jeevan Patil 2018-03-21 21:03.

ステレオタイプの説明:

  • @Service-すべてのサービスクラスに@Serviceアノテーションを付けます。このレイヤーは作業単位を知っています。すべてのビジネスロジックはサービスクラスに含まれます。通常、サービス層のメソッドはトランザクションでカバーされます。1つのトランザクションが失敗した場合、すべてのトランザクションがロールバックする必要がある場合は、サービスメソッドから複数のDAO呼び出しを行うことができます。
  • @Repository-すべてのDAOクラスに@Repositoryアノテーションを付けます。すべてのデータベースアクセスロジックはDAOクラスに含まれている必要があります。
  • @Component -他のコンポーネント(RESTリソースクラスなど)にコンポーネントステレオタイプで注釈を付けます。
  • @Autowired [email protected] Autowiredアノテーションを使用して、Springに他のBeanをクラスに自動配線させます。

@ComponentSpringで管理されるコンポーネントの一般的なステレオタイプです。@Repository@Service、および@Controllerの特殊化され@Component、それぞれのより具体的なユースケースのために、例えば、持続性、サービス、およびプレゼンテーション層で、。

もともとここで答えました。

6
Lova Chittumuri 2019-08-06 21:25.

@ Component、@ Repository、@ Controller、@ Serviceアノテーションの違い

@Component –汎用であり、アプリケーション全体で使用できます。
@Service –サービスレイヤーレベルでクラスにアノテーションを付けます。
@Controller –主にSpringMVCで使用されるプレゼンテーション層レベルでクラスに注釈を付けます。
@Repository –データベースリポジトリとして機能する永続層でクラスに注釈を付けます。

@Controller= @Component(内部アノテーション)+プレゼンテーション層の機能
@Service= @Component(内部アノテーション)+サービス層の機能
@Component=実際のコンポーネント(Bean)
@Repository= @Component(内部アノテーション)+データ層の機能(ドメインBeanの処理に使用)

5
Software Engineer 2020-05-09 03:25.

ここに示されている答えは技術的にはほぼ正しいですが、回答リストが長く、これが一番下になりますが、誰かがそれに遭遇して何か価値のあることを学んだ場合に備えて、ここにも実際に正しい回答を入れる価値があると思いましたそれ。残りの答えが間違っているということではなく、正しくないというだけです。そして、トロルの大群を止めるために、はい、私は技術的にこれらの注釈が事実上同じものであり、春5まででさえ最も交換可能であることを知っています。今、正しい答えのために:

これらの3つの注釈は完全に異なるものであり、互換性はありません。1つではなく3つあるのでわかります。それらは互換性があることを意図していません、それらは優雅さと便利さからそのように実装されているだけです。

現代のプログラミングは、さまざまな比率の発明、芸術、技術、コミュニケーションです。コードは通常、書き込まれるよりもはるかに頻繁に読み取られるため、通信ビットは通常非常に重要です。プログラマーとして、あなたは技術的な問題を解決しようとしているだけでなく、あなたのコードを読む将来のプログラマーにあなたの意図を伝えようとしています。これらのプログラマーはあなたの母国語や社会環境を共有していない可能性があり、50年後にあなたのコードを読んでいる可能性があります(あなたが思うほど可能性は低いです)。遠い将来に効果的にコミュニケーションすることは困難です。したがって、私たちが利用できる最も明確で、最も効率的で、正確で、コミュニケーションのとれた言語を使用することが重要です。最大限の影響を与え、意図をできるだけ明確にするために、慎重に言葉を選んだこと。

たとえば@Repository、リポジトリを作成するときに使用されるのは、ではなく重要です@Component。後者は、リポジトリを見ていることを示していないため、リポジトリの注釈の選択としては非常に不適切です。リポジトリも春の豆であると想定できますが、コンポーネントがリポジトリであるとは限りません。では@Repository、私たちは私たちの言葉ではっきりと特定されています。これはリポジトリであることを明確に述べています。@Component我々は、彼らが読んでいるコンポーネントの種類を決定するために、読者にそれを残している、と彼らは意味を推測するためにクラス全体を読んで(そしておそらくサブクラスとインタフェースの木)する必要があります。その場合、クラスは遠い将来、読者によってリポジトリではないと誤解される可能性があり、これがリポジトリであることを十分に知っていた私たちが自分の言語で特定できなかったため、この間違いの一部の責任を負っていたでしょう。そして私たちの意図を効果的に伝えます。

他の例には触れませんが、できる限り明確に述べます。これらの注釈は完全に異なるものであり、意図に従って適切に使用する必要があります。@Repositoryはストレージリポジトリ用であり、他の注釈は正しくありません。@Serviceはサービス用であり、他の注釈は正しくありません。@Componentはリポジトリでもサービスでもないコンポーネント用であり、代わりにこれらのいずれかを使用することも正しくありません。コンパイルされたり、実行されてテストに合格したりすることもありますが、それは間違いであり、これを行うとしたら(専門的に)あなたのことをあまり考えないでしょう。

春を通して(そして一般的にプログラミング)これの例があります。が利用可能@Controllerであるため、RESTAPIを作成するときに使用しないでください@RestController。が有効な代替手段である@RequestMapping場合@GetMappingは使用しないでください。などなど読者に意図を伝えるために、最も具体的で正確で正しい言語を選択する必要があります。そうしないと、システムにリスクが発生し、リスクにはコストがかかります。

賛成票をありがとう:)

3
Brajesh 2018-07-06 09:11.

Spring Frameworkでは、ステレオタイプアノテーションと呼ばれる特別なタイプのアノテーションが提供されます。これらは次のとおりです:-

@RestController- Declare at controller level.
@Controller – Declare at controller level.
@Component – Declare at Bean/entity level.
@Repository – Declare at DAO level.
@Service – Declare at BO level.

上記で宣言されたアノテーションは特別です<context:component-scan>。xxx-servlet.xmlファイルに追加すると、春はコンテキストの作成/読み込みフェーズで上記のアノテーションが付けられたクラスのオブジェクトを自動的に作成するからです。

2
UHDante 2018-06-21 14:10.

@Component@ Repository@ Service@Controller

@Component春によって管理されるコンポーネントのための一般的なステレオタイプである@Repository@Service@Controllerされ@Component、より具体的な用途のために特化:

  • @Repository 永続性のために
  • @Service サービスおよびトランザクション用
  • @Controller MVCコントローラー用

なぜ使用@Repository@Service@Controllerオーバー@Component?コンポーネントクラスを@Componentでマークすることはできますが、代わりに、期待される機能に適応する代替手段を使用します。私たちのクラスは、それぞれの特定のケースで期待される機能により適しています。

アノテーションが付けられたクラス@Repositoryは、org.springframework.dao.DataAccessExceptionを使用すると、より優れた変換と読み取り可能なエラー処理が可能になります。データにアクセスするコンポーネント(DataAccessObjectまたはDAO)の実装に最適です。

@ControllerSpring WebMVCアプリケーションでコントローラーの役割を果たす注釈付きクラス

@Serviceビジネスロジックサービスで役割を果たす注釈付きクラス、DAOマネージャーのファサードパターンの例(ファサード)およびトランザクション処理

1
Mohamed Sweelam 2019-05-01 10:21.

この図を簡単にするために、私たちはユースケースによって専門性を考えてみましょう、これらのアノテーションを注入するために使用されていると私が言ったように、文字通り「注入されるために使用し、使用する方法を知っていれば、それは平均、」依存性注入「DI」とあなたを必要に応じて、常にこれらのアノテーションを探し、クラスにこれらのステレオタイプでアノテーションを付けることで、他の場所に注入できるようにスキャンするようにDIコンテナに通知します。これが実用的なターゲットです。

次に、それぞれに移動しましょう。最初の@Service、特定のビジネスケースのロジックを構築している場合、ビジネスロジックを含む場所でそれを分離する必要があります。このサービスは通常のクラスであるか、必要に応じてインターフェイスとして使用でき、次のように記述されます。この

@Service
public class Doer {
   // Your logic 
}

// To use it in another class, suppose in Controller 
@Controller
public class XController {
 // You have to inject it like this 
 @Autowired 
 private Doer doer;
}

それらを挿入するときはすべて同じ方法です。@ Repositoryは、リポジトリパターンの実装を適用するインターフェイスです。リポジトリデザインパターン。通常、データストアやデータベースを扱うときに使用されます。複数のデータストアが含まれていることがわかります。データベース操作を処理するためのすぐに実装できます。CrudRepositoryJpaRepositoryなどにすることができます。

// For example
public interface DoerRepository implements JpaRepository<Long, XEntity> {}

最後に、@ Component、これはSpringに登録されたBeanの汎用フォームです。つまり、Springは登録する@ComponentでマークされたBeanを常に探しています。その後、@ Serviceと@Repositoryはどちらも@Componentの特殊なケースですが、一般的なユースケースコンポーネントの場合は、直接のビジネスケースをカバーするためではなく、純粋に技術的なものを作成する場合です。日付のフォーマットや特別なリクエストのシリアル化メカニズムの受け渡しなど。

0
Mykhailo Moskura 2020-04-19 14:50.

@Componentは、構成クラスで@Beanアノテーションとして機能し、SpringコンテキストでBeanを登録します。また、@ Service、@ Repository、および@Controllerアノテーションの親でもあります。

@Serviceは、@ Componentアノテーションを拡張し、名前の違いのみがあります。

@Repository - @Component注釈を拡張し、内のすべてのデータベースの例外翻訳DataAccessExceptionを。

@ Controller -MVCパターンのコントローラーとして機能します。ディスパッチャは、そのようなアノテーション付きクラスをスキャンしてマップされたメソッドを探し、@ RequestMappingアノテーションを検出します。

Related questions

MORE COOL STUFF

Reba McEntire は、彼女が息子の Shelby Blackstock と共有する「楽しい」クリスマスの伝統を明らかにしました:「私たちはたくさん笑います」

Reba McEntire は、彼女が息子の Shelby Blackstock と共有する「楽しい」クリスマスの伝統を明らかにしました:「私たちはたくさん笑います」

Reba McEntire が息子の Shelby Blackstock と共有しているクリスマスの伝統について学びましょう。

メーガン・マークルは、自然な髪のスタイリングをめぐってマライア・キャリーと結ばれました

メーガン・マークルは、自然な髪のスタイリングをめぐってマライア・キャリーと結ばれました

メーガン・マークルとマライア・キャリーが自然な髪の上でどのように結合したかについて、メーガンの「アーキタイプ」ポッドキャストのエピソードで学びましょう.

ハリー王子は家族との関係を修復できるという「希望を持っている」:「彼は父親と兄弟を愛している」

ハリー王子は家族との関係を修復できるという「希望を持っている」:「彼は父親と兄弟を愛している」

ハリー王子が家族、特にチャールズ王とウィリアム王子との関係について望んでいると主張したある情報源を発見してください。

ワイノナ・ジャッドは、パニックに陥った休暇の瞬間に、彼女がジャッド家の家長であることを認識しました

ワイノナ・ジャッドは、パニックに陥った休暇の瞬間に、彼女がジャッド家の家長であることを認識しました

ワイノナ・ジャッドが、母親のナオミ・ジャッドが亡くなってから初めての感謝祭のお祝いを主催しているときに、彼女が今では家長であることをどのように認識したかを学びましょう.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

オーケーグッド770HPランボルギーニセンテナリオは十分に正気ではない

オーケーグッド770HPランボルギーニセンテナリオは十分に正気ではない

ランボルギーニの創設者であるフェルッチオランボルギーニが100歳になるのは毎日ではありません(そうです、彼は死んでいて、まだ死んでいると思います。

彼らが買った1台の車からAppleの車の計画について私たちが推測できること

彼らが買った1台の車からAppleの車の計画について私たちが推測できること

Appleが自動車分野に参入するという噂はかなり前から渦巻いており、AppleウォッチャーがSixtyEight Researchという会社がAppleの自動車研究開発のシェル会社である可能性が高いと判断したとき、その渦巻きは本当に渦巻いた。また、会社が購入した車は1台だけであることが知られており、その車はAppleが何を考えているかについての手がかりでいっぱいになる可能性があることも伝えています。

天文学者は太陽系の9番目の惑星の新しい証拠を見つけます

天文学者は太陽系の9番目の惑星の新しい証拠を見つけます

太陽系の外側にある架空の大きな物体である惑星Xの探索は、何十年にもわたって人間を魅了してきました。その検索の最新の章は、地球の10倍の大きさで、公転周期が15であるほど遠くにある惑星を指しています。

キャムニュートン、ゴッドダム

キャムニュートン、ゴッドダム

カムニュートンは昨日、簡単な265ヤードと3回のタッチダウンでファルコンズを引き裂き、別の素晴らしいゲームをしました。その日のハイライトは、上のタッチダウンスローでした。これは、視聴するたびにばかげているだけです。

米国のフィギュア スケートは、チーム イベントでの最終決定の欠如に「苛立ち」、公正な裁定を求める

米国のフィギュア スケートは、チーム イベントでの最終決定の欠如に「苛立ち」、公正な裁定を求める

ロシアのフィギュアスケーター、カミラ・バリエバが関与したドーピング事件が整理されているため、チームは2022年北京冬季オリンピックで獲得したメダルを待っています。

Amazonの買い物客は、わずか10ドルのシルクの枕カバーのおかげで、「甘やかされた赤ちゃんのように」眠れると言っています

Amazonの買い物客は、わずか10ドルのシルクの枕カバーのおかげで、「甘やかされた赤ちゃんのように」眠れると言っています

何千人ものAmazonの買い物客がMulberry Silk Pillowcaseを推奨しており、現在販売中. シルクの枕カバーにはいくつかの色があり、髪を柔らかく肌を透明に保ちます。Amazonで最大46%オフになっている間にシルクの枕カバーを購入してください

パデュー大学の教授が覚醒剤を扱った疑いで逮捕され、女性に性的好意を抱かせる

パデュー大学の教授が覚醒剤を扱った疑いで逮捕され、女性に性的好意を抱かせる

ラファイエット警察署は、「不審な男性が女性に近づいた」という複数の苦情を受けて、12 月にパデュー大学の教授の捜査を開始しました。

コンセプト ドリフト: AI にとって世界の変化は速すぎる

コンセプト ドリフト: AI にとって世界の変化は速すぎる

私たちの周りの世界と同じように、言語は常に変化しています。以前の時代では、言語の変化は数年または数十年にわたって発生していましたが、現在では数日または数時間で変化する可能性があります。

SF攻撃で91歳のアジア人女性が殴られ、コンクリートに叩きつけられた

犯罪擁護派のオークランドが暴力犯罪者のロミオ・ロレンゾ・パーハムを釈放

SF攻撃で91歳のアジア人女性が殴られ、コンクリートに叩きつけられた

認知症を患っている 91 歳のアジア人女性が最近、47 番街のアウター サンセット地区でロメオ ロレンゾ パーハムに襲われました。伝えられるところによると、被害者はサンフランシスコの通りを歩いていたところ、容疑者に近づき、攻撃を受け、暴行を受けました。

ℝ

“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.

メリック・ガーランドはアメリカに失敗しましたか?

バイデン大統領の任期の半分以上です。メリック・ガーランドは何を待っていますか?

メリック・ガーランドはアメリカに失敗しましたか?

人々にチャンスを与えることは、人生で少し遅すぎると私は信じています。寛大に。

Language