web-dev-qa-db-ja.com

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

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

URLマッピングとビジネスロジックの呼び出しに使用できる@Controllerについて考えています。

@Serviceは、ビジネスロジックを含むサービスクラスに注釈を付けるために使用されます。

@Controllerの代わりに@Serviceを使用して、サービスクラスに注釈を付けることはできますか?

68
Ketan

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

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

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

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

したがって、Spring MVCアーキテクチャを見ると、適切なコントローラークラス(@Controllerによって注釈が付けられている)に向けてすべてのHTTP要求をディスパッチするフロントコントローラーを表す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();
    }

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

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

これで、より明確になりますように。

108
AndreaNobili

@Controller@Serviceアノテーションの定義を見ると、これらは特別なタイプの@Componentアノテーションであることがわかります。

@Component
public @interface Service {
    ….
}

@Component
public @interface Controller {
    …
}

だから違いは何ですか?

@ Controller

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

@ Controllerの特別な点は何ですか?

このアノテーションは、@Service@Repositoryなどのように見えても、他のアノテーションと切り替えることはできません。ディスパッチャは、@Controllerアノテーションが付けられたクラスをスキャンし、クラス内の@RequestMappingアノテーションを検出します。 @RequestMapping注釈付きクラスでのみ@Controllerを使用できます。


@ Service

@Servicesは、ビジネスロジックを保持し、リポジトリレイヤーでメソッドを呼び出します。

@ Serviceの特別な点は何ですか?

ビジネスロジックを保持していることを示すために使用されるという事実は別として、このアノテーションが提供する顕著な特色はありませんが、春は将来、さらに特別なものを追加する可能性があります。

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

30
Raman Sahasi

いいえ、@Controller@Serviceと同じではありませんが、両方とも@Componentの特殊化であるため、クラスパススキャンによる検出の候補となります。 @Serviceアノテーションはサービスレイヤーで使用され、@ControllerはプレゼンテーションレイヤーのSpring MVCコントローラー用です。 @Controllerは通常、URLマッピングを持ち、Web要求によってトリガーされます。

7
NilsH

@Service vs @Controller

@Service:クラスは(Core 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 Controller

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

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

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

@interface Service

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

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

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

@ interface Repository

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

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

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

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

4
Kanthishere

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

両方に違いはありません。

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

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

いいえ、違うことはできません。アプリが展開されたとき、たとえば、コントローラーマッピングが中断されます。

とにかくしたいのですが、コントローラーはnotサービスであり、逆もまた同様です。

0
NimChimpsky

Spring In Actionから

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

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

0
cos