Spring を使用してアプリケーションを開発しています。@Service
注釈を使用する必要があります。私はそれを持ってServiceI
いServiceImpl
ますServiceImpl implements ServiceI
。@Service
ここで、注釈をどこに保持すればよいかについて混乱しています。
インターフェイスまたは実装に注釈を付ける必要があります@Service
か? これら2つのアプローチの違いは何ですか?
@Component
(または@Service
、...) をインターフェイスに配置することはありません。インターフェイスが役に立たなくなるからです。理由を説明しましょう。
請求 1:インターフェイスがある場合は、そのインターフェイスを注入ポイントの種類に使用します。
クレーム 2:インターフェイスの目的は、複数の実装によって実装できるコントラクトを定義することです。反対側には注入ポイントがあります ( @Autowired
)。インターフェイスを 1 つだけ、それを実装するクラスを 1 つだけ持つことは (IMHO) 役に立たず、YAGNIに違反します。
事実:あなたが置くとき:
@Component
(または@Service
、...) インターフェイスで、次に、取得しますNoUniqueBeanDefinitionException
(または、環境、プロファイル、または修飾子を使用した非常に特別な構成セットアップがあります...)
結論:@Component
インターフェイスで(or , ...)を使用する場合@Service
、2 つのクレインズの少なくとも 1 つに違反する必要があります。@Component
したがって、(いくつかのまれなシナリオを除いて)インターフェイス レベルで配置することは役に立たないと思います。
Spring-Data-JPA リポジトリ インターフェースは完全に異なるものです