1. ホーム
  2. spring

[解決済み] Serviceアノテーションはどこにつけるべきですか?インターフェースか実装か?

2022-04-23 20:02:50

質問

Springを使ってアプリケーションを開発しています。その際 @Service アノテーションを使用します。私は ServiceIServiceImpl そのような ServiceImpl implements ServiceI . をどこに置けばいいのか、ここで混乱しています。 @Service アノテーションを使用します。

インターフェースと実装のどちらをアノテーションするかは @Service ? この2つのアプローチの違いは何ですか?

どのように解決するのですか?

私は一度も @Component (または @Service というのも、これはインターフェイスを無意味にしてしまうからです。その理由を説明しましょう。

請求項1: もしインターフェイスがあるなら、射出ポイントの型にそのインターフェイスを使いたい。

請求項2 インターフェイスの目的は、複数の実装が可能なコントラクトを定義することです。一方、インジェクションポイント( @Autowired ). 1つのインターフェースとそれを実装する1つのクラスしか持たないというのは、(IMHO)無駄であり、以下のような違反になります。 ヤグニ .

の事実があります。 置くと。

  • @Component (または @Service というように、インターフェイスで
  • それを実装しているクラスが複数ある。
  • 少なくとも2つのクラスがSpring Beansになり、かつ
  • 型ベースのインジェクションのためのインターフェイスを使用するインジェクションポイントを持つ。

とすると NoUniqueBeanDefinitionException (または、環境、プロファイル、修飾子など、非常に特殊な設定をしている場合...)

おわりに を使用する場合 @Component (または @Service の2つの条項のうち、少なくとも1つに違反する必要があります。ですから、私は、(稀なシナリオを除いて) @Component をインターフェイスレベルで使用します。


Spring-Data-JPAのリポジトリインターフェースは全く別のものです。