Springアノテーション@Controllerは@Serviceと同じですか?


80

Springアノテーションは@Controllerと同じ@Serviceですか?

ビジネスロジックのマッピングと呼び出しに@Controllerどちらを使用できるかについての考えがありますURL

一方、@Serviceビジネス・ロジックが含まれている注釈サービスクラスに使用。

サービスクラスに注釈を付ける@Controller代わりに使用できます@Serviceか?

回答:


124

いいえ、それらは互いにかなり異なります。

どちらも@Componentアノテーションの異なる特殊化であるため(実際には、同じインターフェイスの2つの異なる実装です)、クラスパススキャンによって両方を検出できます(XML構成で宣言した場合)

@Serviceアノテーションは、サービスレイヤーで使用され、サービスタスクを実行するクラスにアノテーションを付けます。多くの場合、@ Serviceアノテーションは使用しませんが、多くの場合、このアノテーションを使用してベストプラクティスを表します。たとえば、DAOクラスを直接呼び出して、オブジェクトをデータベースに永続化することができますが、これは恐ろしいことです。DAOを呼び出すサービスクラスを呼び出すのはかなり良いことです。これは、関心の分離パターンを実行するのに適しています。

@Controllerアノテーションは、Spring MVCフレームワーク(Webアプリケーションの実装に使用されるSpring Frameworkのコンポーネント)で使用されるアノテーションです。@Controllerアノテーションは、特定のクラスがコントローラーの役割を果たすことを示します。@Controllerアノテーションは、アノテーションが付けられたクラスのステレオタイプとして機能し、その役割を示します。ディスパッチャは、そのようなアノテーション付きクラスをスキャンしてマップされたメソッドを探し、@ RequestMappingアノテーションを検出します。

したがって、Spring MVCアーキテクチャを見ると、すべてのHTTPリクエストを適切なコントローラークラス(@Controllerアノテーションが付けられている)にディスパッチするフロントコントローラーを表すDispatcherServletクラス(XML構成で宣言)があります。このクラスは、そのメソッドによってビジネスロジックを実行します(そしてサービスを呼び出すことができます)。これらのクラス(またはそのメソッド)には、通常、コントローラーとそのメソッドによって処理されるHTTP要求を指定する@RequestMappingアノテーションも付けられます。

例えば:

@Controller
@RequestMapping("/appointments")
public class AppointmentsController {

    private final AppointmentBook appointmentBook;

    @Autowired
    public AppointmentsController(AppointmentBook appointmentBook) {
        this.appointmentBook = appointmentBook;
    }

    @RequestMapping(method = RequestMethod.GET)
    public Map<String, Appointment> get() {
        return appointmentBook.getAppointmentsForToday();
    }

このクラスはコントローラーです。

このクラスは、「/ apointments」「folder」に対するすべてのHTTPリクエストを処理します。特に、getメソッドは、フォルダ「/ appointments」に対するすべてのGETHTTPリクエストを処理するために呼び出されるメソッドです。

今、それがあなたにとってより明確になることを願っています。


3
とてもいい説明です。言及すべき1つのポイントは、(at)コントローラークラスは(at)RequestMappingを持つ必要はなく、(at)RequestMappingはメソッドレベルにすることもできます。
タイムキーパー

1
それらを単一のクラス定義に混在させることはできますか?それとも、それらを別々のクラスとして実装する方が良いですか?
kensai 2017年

37

あなたがの定義を見れば@Controller@Service注釈、あなたはこれらの特殊なタイプのあることがわかります@Component注釈。

@Component
public @interface Service {
    ….
}

 

@Component
public @interface Controller {
    …
}

では、違いは何ですか?

@コントローラ

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

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

同じように見えても、この注釈を他のlike@Service@Repository、と切り替えることはできません。ディスパッチャは、注釈が付けられたクラスをスキャンし、その中の注釈@Controllerを検出@RequestMappingします。あなただけ使用することができます@RequestMapping上の@Controller注釈付きクラス。


@サービス

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

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

ビジネスロジックを保持していることを示すために使用されるという事実を除けば、このアノテーションが提供する目立った専門性はありませんが、春は将来、いくつかの例外を追加する可能性があります。

リンクされた回答:Springの@ Component、@ Repository、@ Serviceアノテーションの違いは何ですか?


7

いいえ、はと@Controller同じではありませんが、@Serviceどちらもの専門分野である@Componentため、クラスパススキャンによる検出の候補になります。@Service注釈は、あなたのサービス層で使用されており、@Controllerプレゼンテーション層でSpring MVCのコントローラ用です。Aは、@Controller一般的にURLマッピングを持っているでしょうし、Webリクエストによってトリガーされます。


5

@Service vs @Controller

@Service:クラスは「ビジネスサービスファサード」(コアJ2EEパターンの意味で)または同様のものです。

@Controller:アノテーション付きクラスが「コントローラー」(Webコントローラーなど)であることを示します。

----------主要なステレオタイプに関する有用なメモを見つける http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Component.html

@interfaceコンポーネント

  @Target(value=TYPE)
     @Retention(value=RUNTIME)
     @Documented
    public @interface Component

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

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

@interfaceコントローラー

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Controller

注釈付きクラスが「コントローラー」(Webコントローラーなど)であることを示します。

このアノテーションは@Componentの特殊化として機能し、クラスパススキャンを通じて実装クラスを自動検出できるようにします。これは通常、RequestMappingアノテーションに基づくアノテーション付きハンドラーメソッドと組み合わせて使用​​されます。

@インターフェースサービス

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Service

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

このアノテーションは@Componentの特殊化として機能し、クラスパススキャンを通じて実装クラスを自動検出できるようにします。

@interfaceリポジトリ

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Repository

注釈付きクラスが「リポジトリ」であることを示します。元々はドメイン駆動設計(Evans、2003)によって、「オブジェクトのコレクションをエミュレートするストレージ、取得、および検索動作をカプセル化するメカニズム」として定義されています。「データアクセスオブジェクト」などの従来のJ2EEパターンを実装するチームも、このステレオタイプをDAOクラスに適用できますが、その前にデータアクセスオブジェクトとDDDスタイルのリポジトリの違いを理解するように注意する必要があります。この注釈は汎用のステレオタイプであり、個々のチームはセマンティクスを絞り込み、必要に応じて使用できます。

このように注釈が付けられたクラスは、PersistenceExceptionTranslationPostProcessorと組み合わせて使用​​すると、SpringDataAccessException変換の対象になります。注釈付きのクラスは、ツールやアスペクトなどの目的で、アプリケーションアーキテクチャ全体におけるその役割についても明確にされています。

Spring 2.5以降、このアノテーションは@Componentの特殊化としても機能し、クラスパススキャンを通じて実装クラスを自動検出できるようになります。


1

私はすでにここ同様の質問に答えましたここにリンクがあります

どちらも違いはありません。

@Serviceアノテーションは他の目的に使用され、@ Controllerは他の目的に使用されます。実際には、Spring @ Component、@ Service、@ Repository、および@Controllerアノテーションは、Springフレームワークのクラスパススキャンを使用した自動Bean検出に使用されますが、すべての機能が同じであるとは限りません。@Service:アノテーション付きクラスがビジネス層のサービスコンポーネントであることを示します。

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


0

いいえ、違いはありません。アプリがデプロイされると、たとえばコントローラーのマッピングが中断されます。

とにかく、なぜコントローラーはサービスではなく、その逆も同様です。


0

Spring InActionから

ご覧のとおり、このクラスには@Controllerアノテーションが付けられています。@Controllerは、それ自体ではあまり機能しません。その主な目的は、このクラスをコンポーネントスキャンのコンポーネントとして識別することです。HomeControllerには@Controllerアノテーションが付けられているため、Springのコンポーネントスキャンは自動的にそれを検出し、SpringアプリケーションコンテキストでBeanとしてHomeControllerのインスタンスを作成します。

実際、他のいくつかのアノテーション(@ Component、@ Service、および@Repositoryを含む)は、@ Controllerと同様の目的を果たします。HomeControllerに他の注釈を効果的に注釈を付けることもできますが、それでも同じように機能します。ただし、@ Controllerの選択は、アプリケーションでのこのコンポーネントの役割をより詳しく説明しています。


0

あなたは宣言でき@serviceとして@Controllerを

@Controller@Serviceとして宣言することはできません

@サービス

定期的です。クラスをコンポーネントとして宣言しているだけです。

@コントローラ

コンポーネントよりも少し特別です。ディスパッチャは、を検索します@RequestMappingこちら。したがって、@ Controllerアノテーションが付けられたクラスは、APIが呼び出されるURLを宣言することでさらに権限が与えられます。


0
  • コントローラは、異なるビュー間のナビゲーションを処理します。マッピング要求マッピングは、コントローラーの助けを借りて処理されます。
  • サービスは、通常ビジネスロジックが実行されるリポジトリと直接対話します。サービスレイヤーで追加、削除、削除などを行うことができます
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.