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

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

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

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

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

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

今週のコミックコンですべての素晴らしいものに追いつく方法

今週のコミックコンですべての素晴らしいものに追いつく方法

サンディエゴコミックコンは今週開幕し、オタクのアナウンス、ポスター、予告編、お気に入りの番組や映画のからかいでいっぱいになります。SDCCは、コンベンションフロア全体の多くのパネルで行われているため、すべてに対応するのは難しい場合があります。

Googleの9千万ドルの和解はアプリ開発者にとってもGoogleにとっても勝利ですか?

Googleの9千万ドルの和解はアプリ開発者にとってもGoogleにとっても勝利ですか?

小さなアプリ開発者は金曜日に発表された法的な和解でグーグルから9千万ドルをこじ開けた。アップルとの同様の合意に続いて熱くなった。金曜日のブログ投稿で、Googleは、Androidメーカーが市場での優位性を悪用してPlayストア経由でのアプリ内購入に対して30%の料金を不当に請求したと主張するアプリ開発者との訴訟を解決するために、9千万ドルを支払うことに合意したと述べました。

RadioShackのTwitterはハッキングされていませんでした、それはただの暗号のサクラです

RadioShackのTwitterはハッキングされていませんでした、それはただの暗号のサクラです

今週、RadioShackのTwitterアカウントは、奇妙なものから完全にひどいものになりました。短い順序で、会社のフィード全体が、バイブレーター、「ビッグティット」(スペルミス)、有名人やその他の企業アカウントを荒らしているツイートなど、NSFW素材の真の山になりました。

ヒッグス粒子から10年後、物理学にとって次の大きなものは何ですか?

ヒッグス粒子から10年後、物理学にとって次の大きなものは何ですか?

大型ハドロン衝突型加速器のトンネル内にあるコンパクトミュオンソレノイド(CMS)検出器。2012年7月4日、CERNの科学者たちは、1960年代に最初に提案された素粒子であるヒッグス粒子の観測を確認しました。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

Un breve viaje espacial sobre conceptualizar el diseño

Complicarse la vida, mezclar churros con meninas (nada de ovejas) y encontrar valor en un trastero que adquiriste en una puja.

Un breve viaje espacial sobre conceptualizar el diseño

Bien. Hay un momento en toda salida al espacio exterior en el que de la tensión, la velocidad y las altas temperaturas derivadas del cruce de estratosfera a ionosfera se pasa a un momento de súbita calma, donde se despliega la vista completa del paisaje espacial que nos rodea.

Seguindo Todos os Protocolos (2022), de Fábio Leal

Seguindo Todos os Protocolos (2022), de Fábio Leal

Chico quer transar. Até aí, tudo bem.

多元宇宙—Junø

多元宇宙—Junø

チェーン間アカウントがJunoに登場します。異なるブロックチェーン間でスマートコントラクトの構成可能性と真の相互運用性を提供します。

#brand【ベター・コール・ソール!アメリカのテレビシリーズ「ブレイキング・バッド」に最高のビジネス例が隠されている】・・・ルールクリエイティブ

#brand【ベター・コール・ソール!アメリカのテレビシリーズ「ブレイキング・バッド」に最高のビジネス例が隠されている】・・・ルールクリエイティブ

1.ドラマを見た後、起業する考えはありますか?あなたのビジネスはボトルネックに遭遇しましたか?方向性がなくてわからない場合は、ドラマを追いかけて行くことを心からお勧めします。(?)ブラフではなく、最も完璧なビジネス例を隠すドラマがあります。2.ブレイキング・バッドとその弁護士ドラマ「ブレイキング・バッド」を見た友人たちは、演劇の中で、穏やかな表情で、弁護士のソウル・グッドマンに深く感銘を受けなければなりません。口を開けて、感覚の弱い傭兵の性格を持っています。道徳の面で、サル・グッドマンは無意識のうちに劇に欠かせない役割を果たし、彼自身のシリーズ「絶望的な弁護士」(ベター・コール・ソール)を生み出しました。ウェントウのテキストとビデオは、劇中のソウル・グッドマンのテレビコマーシャルです。製品(サービス)、競争戦略、市場ポジショニング、ブランド名、ターゲット顧客グループ、コミュニケーション軸から広告まで、サル・グッドマンの役割のビジネス設定は、「最低」と見なすことができる超超超超超超完全です。ブランドコミュニケーションのコスト」「変化」のモデル。なぜ?私の分析をご覧ください。3.ソウル・グッドマンの「事業戦略」1.基本情報ブランド名:Saul Goodman製品:法律相談サービス対象顧客:麻薬中毒、飲酒運転、事故など。法律知識の欠如は、一般的に公立弁護士にしか余裕がなく、真面目な弁護士も「特別な法律を持つ消費者」を避けます。恐れてはいけない「​​ニーズ」。コミュニケーションの主軸:この国のすべての男性、女性、子供は有罪判決を受けるまで無実だと思います。地域:アルバカーキ市スローガン:Thrallに電話したほうがいいです!(ベター・コール・ソール)広告:2つの可能性のある犯罪状況をシミュレートします+サウルの主張+サウルのスローガン2をより適切に呼び出します。

Language