Springアノテーションは@Controller
と同じ@Service
ですか?
ビジネスロジックのマッピングと呼び出しに@Controller
どちらを使用できるかについての考えがありますURL
。
一方、@Service
ビジネス・ロジックが含まれている注釈サービスクラスに使用。
サービスクラスに注釈を付ける@Controller
代わりに使用できます@Service
か?
回答:
いいえ、それらは互いにかなり異なります。
どちらも@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リクエストを処理するために呼び出されるメソッドです。
今、それがあなたにとってより明確になることを願っています。
あなたがの定義を見れば@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アノテーションの違いは何ですか?
@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
注釈付きクラスがコンポーネントであることを示します。このようなクラスは、注釈ベースの構成とクラスパススキャンを使用する場合、自動検出の候補と見なされます。
@interfaceコントローラー
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Controller
注釈付きクラスが「コントローラー」(Webコントローラーなど)であることを示します。
@インターフェースサービス
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Service
注釈付きクラスが「サービス」であることを示します。元々はドメイン駆動設計(Evans、2003)によって、「カプセル化された状態ではなく、モデル内でスタンドアロンとして提供される操作」として定義されています。クラスが「ビジネスサービスファサード」(コアJ2EEパターンの意味で)または類似のものであることを示す場合もあります。この注釈は汎用のステレオタイプであり、個々のチームはセマンティクスを絞り込み、必要に応じて使用できます。
@interfaceリポジトリ
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Repository
注釈付きクラスが「リポジトリ」であることを示します。元々はドメイン駆動設計(Evans、2003)によって、「オブジェクトのコレクションをエミュレートするストレージ、取得、および検索動作をカプセル化するメカニズム」として定義されています。「データアクセスオブジェクト」などの従来のJ2EEパターンを実装するチームも、このステレオタイプをDAOクラスに適用できますが、その前にデータアクセスオブジェクトとDDDスタイルのリポジトリの違いを理解するように注意する必要があります。この注釈は汎用のステレオタイプであり、個々のチームはセマンティクスを絞り込み、必要に応じて使用できます。
このように注釈が付けられたクラスは、PersistenceExceptionTranslationPostProcessorと組み合わせて使用すると、SpringDataAccessException変換の対象になります。注釈付きのクラスは、ツールやアスペクトなどの目的で、アプリケーションアーキテクチャ全体におけるその役割についても明確にされています。
Spring 2.5以降、このアノテーションは@Componentの特殊化としても機能し、クラスパススキャンを通じて実装クラスを自動検出できるようになります。
私はすでにここで同様の質問に答えましたここにリンクがあります
どちらも違いはありません。
@Serviceアノテーションは他の目的に使用され、@ Controllerは他の目的に使用されます。実際には、Spring @ Component、@ Service、@ Repository、および@Controllerアノテーションは、Springフレームワークのクラスパススキャンを使用した自動Bean検出に使用されますが、すべての機能が同じであるとは限りません。@Service:アノテーション付きクラスがビジネス層のサービスコンポーネントであることを示します。
@Controller:アノテーション付きクラスは、それがコントローラーコンポーネントであり、主にプレゼンテーション層で使用されることを示します。
Spring InActionから
ご覧のとおり、このクラスには@Controllerアノテーションが付けられています。@Controllerは、それ自体ではあまり機能しません。その主な目的は、このクラスをコンポーネントスキャンのコンポーネントとして識別することです。HomeControllerには@Controllerアノテーションが付けられているため、Springのコンポーネントスキャンは自動的にそれを検出し、SpringアプリケーションコンテキストでBeanとしてHomeControllerのインスタンスを作成します。
実際、他のいくつかのアノテーション(@ Component、@ Service、および@Repositoryを含む)は、@ Controllerと同様の目的を果たします。HomeControllerに他の注釈を効果的に注釈を付けることもできますが、それでも同じように機能します。ただし、@ Controllerの選択は、アプリケーションでのこのコンポーネントの役割をより詳しく説明しています。