2016-02-17 2 views
6

@serviceをサービスインプリメンテーションに、@repositoryをDAO実装に使用する必要があるのはなぜですか?春のMVCで@service@repositoryアノテーションを交換すると問題はありません。春のMVCで@serviceと@repositoryの注釈を交換するとどうなるでしょう

+2

これはおそらくあなたの取引を台無しにするでしょう。サービスは、DAOに伝播が必要なトランザクションを渡す必要があります。どちらもコンポーネントなので、Beanの作成は問題にはなりません。 – TheLostMind

答えて

6

documentaion@Repository,,@Controllerはすべて同義語です。それらはすべて、@Component注釈の専門です。だから、一般的に、彼らは他の1つのisteadを使用することができます。しかし...あなたはこれをしてはいけません。

第1の理由:この注釈のいずれかは、アプリケーション内のコンポーネントの役割を明確にします。このコンポーネントはコントローラ、サービス、またはデータレイヤに属しているかどうかを示します。

第2の理由:この注釈のいくつかは、異なるSpringモジュールによって異なる方法で処理されます。たとえば、Spring Data JPA@Repositoryを処理し、この注釈でマークされたインターフェイスを実装に置き換えようとします。 Springはまた、そのようなクラスに対して自動例外翻訳を適用します。別の例では、Spring Web MVCのプロセス@Controllerを使用し、URLマッピングでそのクラスでマークされたクラスを使用します。

実際、将来のバージョンでは、Springの一部のモジュールでは特別な方法で@Serviceを処理できます。単純ではない@Component

@Repository、@Service、および@Controllerは Springフレームワークの将来のリリースで追加のセマンティクスを運ぶことも可能である:ドキュメントのアドバイスが理由です。 したがって、サービス層である の@Componentと@Serviceのどちらを使用するかを選択する場合は、@Serviceが明らかに適しています。

1

フレームワークの残りの部分で使用する内容によって異なります。理論的には、@Service@Repository注釈は基本的に@Component注釈であるため、何も変わりません。同じことが@Controllerまたは@Endpoint(Spring Wsの場合は、さらにあります)について言えます。

しかし、クラス(サービス、リポジトリ)の意図を表し、そのクラスがどのレイヤーに属するかをユーザーに明確にします。

ただし、トランザクション管理にSpringを使用している場合は、@Repositoryもそのクラスのadding exception translationのトリガーになります(reference guideも参照)。

にはがありませんが、それはおそらくいつかなります。

関連する問題