171

Spring を使用してアプリケーションを開発しています。@Service注釈を使用する必要があります。私はそれを持ってServiceIServiceImplますServiceImpl implements ServiceI@Serviceここで、注釈をどこに保持すればよいかについて混乱しています。

インターフェイスまたは実装に注釈を付ける必要があります@Serviceか? これら2つのアプローチの違いは何ですか?

4

9 に答える 9

187

@Component(または@Service、...) をインターフェイスに配置することはありません。インターフェイスが役に立たなくなるからです。理由を説明しましょう。

請求 1:インターフェイスがある場合は、そのインターフェイスを注入ポイントの種類に使用します。

クレーム 2:インターフェイスの目的は、複数の実装によって実装できるコントラクトを定義することです。反対側には注入ポイントがあります ( @Autowired)。インターフェイスを 1 つだけ、それを実装するクラスを 1 つだけ持つことは (IMHO) 役に立たず、YAGNIに違反します。

事実:あなたが置くとき:

  • @Component(または@Service、...) インターフェイスで、
  • それを実装する複数のクラスがあり、
  • 少なくとも 2 つのクラスが Spring Bean になり、
  • タイプベースのインジェクション用のインターフェースを使用するインジェクションポイントを持ち、

次に、取得しますNoUniqueBeanDefinitionException (または、環境、プロファイル、または修飾子を使用した非常に特別な構成セットアップがあります...)

結論:@Componentインターフェイスで(or , ...)を使用する場合@Service、2 つのクレインズの少なくとも 1 つに違反する必要があります。@Componentしたがって、(いくつかのまれなシナリオを除いて)インターフェイス レベルで配置することは役に立たないと思います。


Spring-Data-JPA リポジトリ インターフェースは完全に異なるものです

于 2015-11-04T19:32:01.927 に答える