最近、私たちのチームでは、コードでスプリングアノテーションを使用してスプリングの依存関係を定義することについて議論し始めました。現在、context.xmlを使用して依存関係を定義しています。どちらのアプローチのための手がかりを与えてくれますか?
編集:これはより一般的な質問と重複する質問のようですが、依存関係注入のみの注釈と設定の影響に興味があります。一般的な質問とは異なる答えと態度があると思います。
ここで関連する投稿をいくつか読み、チームでさらに議論した後、次の結論に達しました。ここで他の人にも役立つことを願っています。
XML構成について(これまで使用していました)、ライブラリによって定義された依存関係のためにそれを保持することにしました(私たちまたはサードパーティによって開発されているかどうかに関係なく)。
ライブラリは、定義上、特定の機能を提供し、DIを必ずしも必要としないさまざまなシナリオで使用できます。したがって、私たちが開発するライブラリプロジェクトで注釈を使用すると、DIフレームワーク(この場合はSpring)のライブラリへの依存関係が作成され、非DIコンテキストではライブラリが使用できなくなります。余分な依存関係を持つことは、私たちのチーム(一般的には私見)の良い習慣とはみなされません。
アプリケーションをアセンブルするとき、アプリケーションコンテキストは必要な依存関係を定義します。これにより、アプリケーションが参照されるすべてのコンポーネントを結合する中心的なユニットになるため、依存関係の追跡が簡素化されます。通常は、実際にすべての配線が行われるはずです。
XMLは、多くのコンポーネントを使用するアプリケーションモジュールを再コンパイルせずに、多くのコンポーネントにモック実装を提供する場合にも役立ちます。これにより、ローカル環境または実稼働環境で実行するテストの柔軟性が得られます。
注釈に関して、注入されたコンポーネントが変化しない場合にそれらを使用するメリットがあると判断しました。たとえば、アプリケーション全体でコンポーネントの特定の実装のみが使用されます。
アノテーションは、依存関係の異なる実装を一度に変更したりサポートしたりせず、異なる方法で構成されそうにない(たとえば、異なるビルドに異なる依存関係を使用する)小さなコンポーネント/アプリケーションに非常に役立ちます。シンプルなマイクロサービスがこのカテゴリに該当します。
アノテーションで構成された十分に小さいコンポーネントは、それぞれのアプリケーションでXML構成をカバーすることなく、さまざまなプロジェクトですぐに使用できます。これにより、アプリケーションのアプリケーション依存関係の配線が簡素化され、セットアップの繰り返しが減ります。
ただし、このようなコンポーネントには技術文書で詳しく説明されている依存関係があるはずであるため、アプリケーション全体を組み立てるときに、コードをスクロールしたり、IDEにモジュールをロードしたりすることなく、これらの依存関係を把握できます。
注釈が設定されたコンポーネントのマイナスの副作用は、異なるコンポーネントが推移的な依存関係を衝突させる可能性があることです。また、競合を解決するのは最終アプリケーション次第です。これらの依存関係がXMLで定義されていない場合、競合解決のアプローチは非常に制限され、可能な限りベストプラクティスから遠ざかります。そのため、アノテーションを使用する場合、コンポーネントは使用する依存関係について十分に成熟している必要があります。
一般に、シナリオによって依存関係が異なる場合、またはモジュールを異なるコンポーネントで使用できる場合、XMLに固執することにしました。明らかに、両方のアプローチの間にrightバランスが必要であり、使用法の明確なアイデアがなければなりません。
混合アプローチに関する重要な更新。最近、QAチーム用に作成したテストフレームワークのケースがあり、別のプロジェクトの依存関係が必要になりました。このフレームワークは、アノテーションアプローチとSpring構成クラスを使用するように設計されていますが、参照プロジェクトには、参照する必要があるいくつかのxmlコンテキストがありました。残念ながら、テストクラス(ここではorg.testng
はスプリングをサポートしています)xmlまたはJava構成クラスでのみ機能し、両方を混在させることはできません。
この状況は、アプローチの混合が衝突し、明らかに、アプローチを破棄しなければならない場合を示しています。このケースでは、テストフレームワークを移行してspring xmlコンテキストを使用しましたが、他の使用法はその逆を意味する可能性があります。
私の経験から、XMLと注釈ベースのDIの組み合わせを使用することを好みます(または、むしろ制限によって強制されます)。 Bean内に要素のマップを挿入する必要がある場合は、util:mapを定義して自動配線する必要があります。また、複数のデータソースなどがある場合は、XML DIを使用してデータソースをsessionFactoryに注入する必要があります。それで、両方の組み合わせは報われるでしょう。
サービスとDaoを自動検出するために、コンポーネントスキャンを使用することを好みます。これにより、多くの構成が削減されます(コンポーネントスキャンに切り替えることで構成ファイルが約50%削減されます)。注釈ベースのDIは、byName(@Resource)とbyType(@Autowired)の両方をサポートします。
要するに、両方の備品に行くことである私のアドバイス。 Springの今後のリリースでは、より多くのアノテーションサポートが確実にカードに追加されると思います。
こちらの回答をご覧ください: Xml設定と注釈ベースの設定
そこから直接短い引用:
注釈には用途がありますが、XML構成を殺すための特効薬ではありません。 2つを混ぜることをお勧めします!
たとえば、Springを使用している場合、アプリケーションの依存性注入部分にXMLを使用することは完全に直感的です。これにより、コードの依存関係が使用されるコードから離れますが、対照的に、依存関係を必要とするコードで何らかの注釈を使用すると、コードはこの自動構成を認識します。
ただし、トランザクション管理にXMLを使用する代わりに、アノテーションでメソッドをトランザクションとしてマークすることは完全に理にかなっています。これはプログラマがおそらく知りたい情報だからです。
編集:また、ここの答えを見てください: Java依存関係の注入:XMLまたは注釈 これらは、おそらくあなたの興味のある領域をはるかによくターゲットにしています。
XML構成を使用する利点:
つまり、短いXML構成では少し手間がかかりますが、後で大きなプロジェクトで多くの時間と頭痛の種を節約できます。
私自身の経験から、xml構成よりも注釈の方が優れています。いずれにしても、xmlをオーバーライドして注釈を使用できると思います。また、Spring 4は注釈の巨大なサポートを提供します。xmlから注釈e.t.cへのセキュリティをオーバーライドできるため、100行のxmlではなく10行のJava Code。
Springを構成するために、アノテーションはXMLより優れていますか?
注釈ベースの構成の導入により、このアプローチがXMLよりも「優れている」かどうかという疑問が生じました。短い答えは、それが依存するということです。長い答えは、各アプローチには長所と短所があり、通常、どの戦略がより適しているかを決定するのは開発者の責任です。それらが定義される方法のために、アノテーションは宣言で多くのコンテキストを提供し、より短くより簡潔な構成につながります。ただし、XMLは、コンポーネントなしでの配線に優れています。
ソースコードに触れるか、再コンパイルします。ソースに近い配線を好む開発者もいれば、注釈付きクラスはもはやPOJOではなく、さらに構成が分散化され制御が難しくなると主張する開発者もいます。
選択に関係なく、Springは両方のスタイルに対応でき、それらを組み合わせることもできます。 Springでは、JavaConfigオプションを使用して、ターゲットコンポーネントのソースコードに触れることなく、注釈を非侵襲的に使用できること、ツールの観点から、Spring Tool Suiteですべての構成スタイルがサポートされていることを指摘しておく価値があります。
私の個人的な選択肢は、XMLがすべて1か所にあり、クラスを検索するためにパッケージを深く調べる必要がないためです。
どの方法が良いかわかりません。プロジェクトによって異なります。 xmlもアノテーションも回避できます。 xmlを使用する利点の1つは、xmlコンテキストファイルを見るだけでプロジェクト構造を理解できることですが、アノテーションにより多くのメタ構成が削減されます。ですから、30%のxmlと70%のアノテーションを好みます。