web-dev-qa-db-ja.com

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

@Component@Repository、および@Serviceアノテーションは、Springで互換的に使用できますか。それとも、それらは、記法デバイスとして機能すること以外に何らかの特定の機能を提供しますか?

言い換えれば、Serviceクラスがあり、アノテーションを@Serviceから@Componentに変更した場合でも、それは同じように動作しますか?

それともアノテーションはクラスの振る舞いや機能にも影響を与えますか?

1824
Colin McCree

From - 春のドキュメント

Spring 2.0以降では、@Repositoryアノテーションは、リポジトリの役割またはステレオタイプ(Data Access ObjectまたはDAOとも呼ばれる)を満たすクラスのマーカーです。このマーカーの用途には、例外の自動変換があります。

Spring 2.5ではさらにステレオタイプアノテーション@Component@Service@Controllerが導入されました。 @Componentは、Springが管理するすべてのコンポーネントの一般的なステレオタイプです。 @Repository@Service、および@Controllerは、@Componentの特殊化した使用例(それぞれ、永続層、サービス層、プレゼンテーション層など)の特殊化です。

したがって、コンポーネントクラスに@Componentで注釈を付けることができますが、代わりに@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)      │
└────────────┴─────────────────────────────────────────────────────┘
1346
stivlo

これらのアノテーションが何のために使われているのかをすでに多くの答えが述べているので、ここではそれらの間のいくつかの小さな違いに焦点を当てます。

まず類似性

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


@ Component、@ Repository、@ Controller、および@Serviceの違い

@Component

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

@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、および@Repositoryが特殊な種類の@Componentアノテーションであると言っても間違いありません。 <context:component-scan>はそれらをピックアップし、それらが@Componentでアノテーションが付けられているかのように、それらの後続のクラスをBeanとして登録します。

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


@リポジトリ

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

@リポジトリについて何が特別なのですか?

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

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

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


@Controller

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

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

このアノテーションを@Service@Repositoryのようなものに変更することはできません、たとえそれらが同じに見えても。ディスパッチャは@Controllerでアノテーションが付けられたクラスをスキャンし、それらの中で@RequestMappingアノテーションを検出します。 @RequestMappingのアノテーションが付けられたクラスでのみ/ @Controllerを使用できます。


@Service

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

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

ビジネスロジックを保持していることを示すために使用されてきたという事実を除けば、このアノテーションには他に注目に値するものはありません。しかし、知っている人であれば、Springは将来さらに優れたものを追加するかもしれません。


他に何がありますか?

上記と同様に、将来的にはSpringはそれらの階層化規約に基づいて@Service@Controllerおよび@Repositoryに特別な機能を追加するかもしれません。そのため、規約を尊重し、それをレイヤーに合わせて使用​​することをお勧めします。

623
Raman Sahasi

それらはほとんど同じです - それらがすべてクラスがSpring beanであることを意味します。 @Service@Repository、および@Controllerは特殊化された@Componentsです。あなたは彼らと一緒に特定のアクションを実行することを選択できます。例えば:

  • @Controller豆はspring-mvcにより使用されます
  • @Repository Beanは永続性例外変換に適しています

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

@Componentが提供することの一つは、あなたが他のアノテーションにそれにアノテーションを付けることができ、そしてそれらを@Serviceと同じように使うことができるということです。

例えば最近私が作った:

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

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

412
Bozho

@Componentはと同等です

<bean>

@Service、@Controller、@リポジトリ= {@Component +その他の特別な機能}

つまり、Service、Controller、およびRepositoryは機能的に同じです。

3つのアノテーションは、アプリケーション内で "Layers" を区切るために使用されます。

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

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

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

そのため、DAOメソッドの「前後」、「前」または「後」にDAOのロギングを実行できます。あなたはそもそもDAOを持っていたのでそれをすることができます。あなたが今達成したことは 懸念やタスクの分離です。

アノテーション@Controllerが1つしかない場合、このコンポーネントにはディスパッチ、ビジネスロジック、およびデータベースへのアクセスがすべて混在しているため、コードが汚れています。

上記の説明は非常に一般的なシナリオの1つですが、3つのアノテーションを使用する理由についてはさらに多くの使用例があります。

348
Oliver

Springでは、@Component@Service@Controller、および@Repositoryは、以下に使用されるステレオタイプ注釈です。

@Controller: whererequestプレゼンテーションページからのマッピングプレゼンテーション層は他のファイルに移動せず、@Controllerクラスに直接移動し、必要に応じてメソッド呼び出しの前に書き込まれた@RequestMappingアノテーションで要求されたパスをチェックします。

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

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

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

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

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

enter image description here

213
Harshal Patil

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

@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を使用した設定の書き込み

66
Ajit Singh

データベース接続の観点から、@Serviceおよび@Repositoryアノテーションの使用は重要です。

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

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

43
Das

@リポジトリ @Service @Controller は、それに基づいてより具体的に使用するために@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.
26
atish shimpi

技術的には@ Controller、@ Service、@ Repositoryはすべて同じです。それらはすべて@Componentsを拡張したものです。

Springのソースコードから。

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

すべてのBeanに@Componentを直接使用できますが、大規模アプリケーションの理解と保守性を向上させるために、@ Controller、@ Service、@ Repositoryを使用します。

各注釈の目的

1)@Controller - >これでアノテーションが付けられたクラスは、クライアントサイドからリクエストを受け取ることを目的としています。最初のリクエストはDispatcherサーブレットに送られ、そこから@RequestMappingアノテーションの値を使用してリクエストが特定のコントローラーに渡されます。

2)@Service - >これでアノテーションが付けられたクラスは、クライアントから受け取るか、データベースから取得するデータを操作するためのものです。データを使ったすべての操作はこの層で行われるべきです。

3)@Repository - >これが付いたクラスは、データベースに接続することを目的としています。 DAO(データアクセスオブジェクト)層と見なすこともできます。このレイヤはCRUD(作成、取得、更新、削除)操作のみに制限されるべきです。何らかの操作が必要な場合は、データを@Serviceレイヤに送り返す必要があります。

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

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

25
Yogendra123

これらすべてのアノテーションはステレオタイプのアノテーションタイプです。これら3つのアノテーションの違いは

  • @Componentを追加した場合、classの役割はコンポーネントクラスであることを意味します。つまり、ロジックを含むクラスであることを意味しますが、特別にビジネスロジックまたは永続ロジックを含むクラスかコントローラロジックかこの@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
    }
}
  • デフォルトで@Serviceまたは@Repositroyまたは@Controllerアノテーションを追加するたびに、@Componentアノテーションはクラスの上に存在するようになります。
25
Anil Amane

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

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

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

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

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

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

20
hardeep thakur

RESTリソースクラスなど、@ Componentで他のコンポーネントに注釈を付けます。

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

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

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

春の@Component

"Component Specialization"

18
Anil Nivargi

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

今はspringでサポートされているJSR-330を参照すると、Beanを定義するために使用できるのは@Namedだけです(どういうわけか@[email protected])。したがって、この規格によると、ステレオタイプ(@Repository@Service@Controllerなど)をカテゴリBeanに定義することは意味がありません。

しかし、これらの異なるアノテーションを特定の用途に応じて使い分けるには、次のようにします。

  1. 開発者がコンピテンシーのためにより良いカテゴリを定義するのを助けます。この分類は場合によっては役立つようになるかもしれません。 (たとえば、aspect-orientedを使用している場合、これらはpointcutsの候補になる可能性があります。)
  2. @Repositoryアノテーションはあなたのbeanに機能を追加するでしょう(あなたのbeanパーシスタンス層への何らかの自動例外変換)。
  3. Spring MVCを使用している場合、@RequestMappingは、@Controllerのアノテーションが付けられたクラスにのみ追加できます。
17
Alireza Fattahi

Spring 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の方が適しています。同様に、@リポジトリは、前述のように、永続層での自動例外変換のマーカーとしてすでにサポートされています。

15
Quan Nguyen

@Componentや@Repositoryまたは@serviceを入れ替えても

これは同じように動作しますが、コンポーネントや@ serviceを使用すると、リポジトリではなくDAOに関連する特定の例外をキャッチできないということが1つの側面です。

14
Manjush

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

永続層コンポーネントを表すには、次のようにします。@リポジトリ

サービス層コンポーネントを表すには、次のようにします。@Service

プレゼンテーション層のコンポーネントを表すには、次のようにします。@Controller

それ以外の場合は、@ Componentをそれらすべてに使用できます。

12
tech.yenduri

@Componentは、アノテーション付きBeanをスキャンしてDIコンテナーで使用できるようにするトップレベルの汎用アノテーションです。

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

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

@ControllerはBeanのMVCを認識させ、@RequestMappingのようなさらなる注釈の使用を可能にする特殊な注釈です。

ここにもっとあります 詳細

11
Amol Dixit

春のドキュメントを引用するための@Service

注釈付きクラスが「サービス」であることを示します。 もともと「カプセル化された状態を持たず、モデル内で独立したインターフェイスとして提供される操作」としてDomain-Driven Designによって定義されました は、クラスが「ビジネスサービスファサード」(コアJ2EEパターンの意味で)、またはそれに似たものであることも示している可能性があります。この注釈は汎用のステレオタイプであり、個々のチームはその意味を狭めて適切に使用することができます。

Eric evansによるドメイン駆動設計を見ると、

SERVICEは、ENTITIESおよびVALUE OBJECTSが行うように、状態をカプセル化せずにモデル内で独立したインターフェイスとして提供される操作です。サービスは技術フレームワークでは一般的なパターンですが、ドメイン層にも適用できます。ネームサービスは他のオブジェクトとの関係を強調します。 ENTITIESやVALUE OBJECTSとは異なり、純粋にクライアントに対してできることに関して定義されています。 SERVICEは、エンティティではなく、名詞ではなく動詞ではなく、アクティビティに名前が付けられる傾向があります。 SERVICEは抽象的で意図的な定義を持つことができます。オブジェクトの定義とは異なる風味があります。 SERVICEはまだ定義された責任を持つべきです、そしてその責任とそれを満たすインタフェースはドメインモデルの一部として定義されるべきです。操作名はUBIQUITOUS LANGUAGEから来るか、またはそれに導入されるべきです。パラメータと結果はドメインオブジェクトです。サービスは賢明に使用されるべきであり、それらのすべての振る舞いからエンティティおよび値オブジェクトを削除することを許可されるべきではありません。しかし、操作が実際に重要なドメインの概念である場合、SERVICEはMODEL-DRIVEN DESIGNの自然な部分を形成します。モデルでは、実際には何も表していない偽のオブジェクトとしてではなく、SERVICEとして宣言されているため、スタンドアロン操作によって誰かが誤解されることはありません。

eric EvansによるとRepository

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

10
Bharath

@Component :あなたはクラス@Componentに注釈を付け、それがBeanであることをHibernateに伝えます。

@Repository :@Repositoryクラスに注釈を付け、それがDAOクラスであることをHibernateに伝え、それをDAOクラスとして扱うように指示します。未チェックの例外(DAOメソッドからスローされる)をSpring DataAccessExceptionへの変換に適したものにすることを意味します。

@Service :これは、Hibernateが@Transactionalなどのサービスレイヤアノテーションを持つServiceクラスであることをHibernateがServiceコンポーネントとして扱うように指示します。

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

@Service("AAA")
public class CustomerService{

beanオブジェクトは次のようにして取得できます。

CustomerService cust = (CustomerService)context.getBean("AAA");
9
Arun Raaj

Repository および Service Component アノテーションの子です。つまり、それらはすべて Component です。 リポジトリ および Service 展開するだけです。正確には? Service はイデオロギーの違いだけを持っています:私たちはサービスのためにそれを使います。 リポジトリ には特定の例外ハンドラがあります。

7
Maria Karpikova

ステレオタイプの説明:

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

@Componentは、Springが管理するすべてのコンポーネントの一般的なステレオタイプです。 @Repository@Service、および@Controllerは、より具体的なユースケース、たとえばそれぞれ永続層、サービス層、およびプレゼンテーション層における@Componentの特殊化です。

もともと答えました ここ

4
Jeevan Patil

@Component、@ Repository、@ Service、@Controller:

@Componentは、Springが管理するコンポーネントの一般的なステレオタイプです。@ Repository、@ Service、および@Controllerは、より具体的な用途のための@ Component特殊化です。

  • 永続化のための@リポジトリ
  • サービスとトランザクションのための@Service
  • MVCコントローラ用の@Controller

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

"@Repository"でアノテーションが付けられたクラスはorg.springframework.dao.DataAccessExceptionでより良い翻訳と読みやすいエラー処理を持ちます。データにアクセスするコンポーネント(DataAccessObjectまたはDAO)を実装するのに理想的です。

"@Controller"を含むアノテーション付きクラスは、Spring Web MVCアプリケーションでコントローラーの役割を果たします。

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

2
UHDante

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ファイルに追加すると、Springはコンテキストの作成/ロード段階で上記のアノテーションが付けられたクラスのオブジェクトを自動的に作成するので、上記の宣言されたアノテーションは特別です。

2
Brajesh

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

@ControllervsRestController

@RestController

enter image description here

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

@Controller

enter image description here

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

詳細ビュー

2
Patel Romil

この図を単純化するために、ユースケースごとに技術性を考えてみましょう。これらの注釈は注入に使用され、前述のとおり「Used to be injection」、つまり使用方法Dependency Injection "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の特殊なケースですが、コンポーネントの一般的なユースケースは、直接的なビジネスケースをカバーしない純粋に技術的なものを作成する場合です!日付の書式設定や特別なリクエストのシリアル化メカニズムの処理など。

1
Mohamed Sweelam

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

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

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

0
Lova Chittumuri