2016-12-27 13 views
0

これはベストプラクティスタイプの質問です。春のオートワイヤリング、私は1つの実装しか持っていないのですか?もしそうなら、私は実装をオートワイヤリングすべきですか?

私はそれを何十回も聞いた:春にオートワイヤリングとき

a)は、インタフェースのない "実装をautowireすることをお勧めします。

と..

B)私はまた、あなただけの「1」の実装を持っている場合、あなたは本当にインターフェースを使用してはならないことを聞いたことがあります。

ここに私のジレンマがあります。私はインターフェース「MyService」と1つの実装MyServiceImplを持っています。私は@Autowiredz MyService in MyController`と 'MyServiceTest'を使います。

もう1つの実装は必要ありません。

これは明らかにルールb)に違反しますが、実装の自動実行はルールa)に違反します。

私の質問は....どうすればいいですか?この場合、Springを全く使用しないで、新しいキーワードを使用してMyServiceをインスタンス化するだけですか?

+1

新しいキーワードを使用してください新しいキーワードを使用すると、サービスはもはや春の文脈にはありません。 – Patrick

+0

ありがとうございます。このような状況では何がベストプラクティスですか?インタフェースを完全に失い、実装をオートワイヤするだけですか?または、autowired intefaceをそのまま使用することもできます(ただし、実装は1つしかありません)。 –

答えて

1

インターフェイスを自動配線する必要があります。後で実装を変更する場合は、@Autowireの上に@Qualifierを追加し、コード内の名前は変更しないでください。模擬実装をインジェクトするときは、テスト目的にも適しています。

1

実践はInterface not Implementationのコードです。あなたが常にInterfaceにコードを書こうとすると、あなたのコードはより柔軟で疎結合します。したがって、オプションa)を練習するように努力する必要があります。

しかし、これに反対する議論があります。多くの著名な開発者は、実装が複数になるまでInterfaceが必須ではないと考えています。実装が1つしかない場合は、クラスを直接呼び出すことができます。それは世界の終わりではなく、パフォーマンスを大幅に増減させません。しかし、前に述べたように、オプションa)は、オプションb)よりもはるかに柔軟で疎結合しています。

1

interfaceを使用することをお勧めします。私は現時点では必要がなくても、別の実装を作成する機会があります。しかし、アプリケーションは開発段階で変更される予定です。まだ別の人が必要です 要件があります。

私のためには、将来的には変更が可能であることが明らかです。

1

interface今後は誰でも拡張/実装したいと考えているので、これは役に立ちます。

また、規則bに違反することは厳しく禁止されていますが、はありません。 実装上、@Autowiredのルールのみをinterface@Componentにすることができます。よりinfo go with this answer

+0

私にはもう一つの選択肢があります。現時点では、コントローラをテストするためにmoks(mockMvc)を使用します。代わりにMyServiceStub実装を作成し、コントローラに注入することができます。 –

+0

その解決策について考えていますか? –

1

については

明確な答えはありません。それが意味をなさない場合は、インタフェースを使用してください。彼らが「より良い」ため、すべてのインタフェースを使用する人にならないでください。これはSpring固有の概念ではありません。

修正する可能性が低く、アプリケーション専用の実装の場合は、そのインターフェイスをスキップしてください。これが決してあなたのアプリケーションから離れるつもりはない、独占的な実装であれば、それを使うことには本当のメリットはありません。頻繁に変更されたとしても、それがアプリケーション専用の単一クラスであれば、動作(期待される入力と出力)が変わらない限り、引き続きインターフェイスは必要ありません。

プロデューサーで、他のアプリケーションでコードを使用する可能性が高い場合は、インターフェイスを使用します。こうすることで、インタフェースに固執している限り(つまり、動作を変更せずに実装を変更している限り)、コードを心に刻みながらライブラリを使用することができます。

インターフェイスを使用する場合は、実装ではなくインターフェイスをオートワイヤします。