2009-07-10 19 views
20

Hibernate、JPA、SpringのようなJavaフレームワークを見ると、通常はXMLファイルまたは注釈を直接私のクラスに入れてください。xml設定ファイルと比較した注釈(非コンパイラ)の長所と短所

私はどのようにすればよいか自問自答しています。

アノテーションを使用すると、クラスとその構成が一緒になりますが、xmlを使用すると、すべてのクラス構成が表示されるため、システムの画像が大きくなります。

注釈もいくつかの方法でコンパイルされますが、XMLを解析するよりも速くなければなりませんが、構成を変更したい場合は、xmlファイルを変更する代わりに再コンパイルする必要があります。顧客側の生産環境ではさらに便利になります)。

私のポイントを見ると、私はXML形式になる傾向があります。しかし、フォーラムやチュートリアルを見るときは、通常注釈が使用されます。

賛否両論は何ですか?

答えて

22

実際のところ、完全再デプロイメントを行わずに変更したいことがわかるようなもの(パフォーマンスパラメータの調整など)は、XMLファイルなどの「柔軟な設定が可能なもの」になるはずです。現実的には決して変化しないものや、とにかくコードを変更しなければならないような状況でのみ、アノテーションに合理的に入れることができます。

注釈とXMLのパフォーマンスの差異については、無視してください。設定が絶対にの場合は、の違いはごくわずかです。

柔軟性と可読性に集中します。

+0

ありがとうございました。私は同時に両方を使うことを考えなかった。 – lostiniceland

+1

注釈にはコードに付随する利点があります。したがって、別のファイルよりも同期が外れる可能性は低くなります。別のファイルにあるオプションは、ユニットテストで完全にカバーされていることを確認してください。つまり、あなたの最善の策は、上記のアドバイスをすることです。 –

+1

展開された環境(QA vs.生産)または展開を行う人が提供する必要がある環境(データベースパスワードなど)によって異なる値も、外部構成の候補になります。 – NamshubWriter

3

APIを作成している場合は、注釈がパブリックインターフェイスに漏れる可能性があります。これは信じられないほど威嚇する可能性があります。

私は現在、APIベンダーがSpring MBeanアノテーションを実装したAPIを使用しています。これは、Springを使用する必要がない可能性があるにもかかわらず、瞬時にSpringライブラリに依存していることを意味します。

(あなたのAPI自体を春に延長した場合はもちろん、これは妥当な仮定であるかもしれない。)

+0

アノテーションはランタイム依存性を引き起こしません。それについて[このコメント](http://stackoverflow.com/questions/2468390/dependency-on-springs-annotations/2473776#2473776)を参照してください。 –

1

私は決断がダウンして「ライフサイクル」に来て、ライフサイクルの間のインピーダンス不整合だと思います。

ライフサイクル:ソースコード、データベース行、コンパイル済みクラス、オブジェクトのいずれにもライフサイクルが関連付けられているかどうかにかかわらず、すべてのデータが保持されます。それはいつ生まれ、いつゴミ収集されますか?

JavaクラスにHibernateアノテーションを設定するとします。特に私が最初から新しいデータベースを作成していて、この1つのアプリケーションだけがそれに接続すると確信しているなら、妥当なアイデアのようです。クラスのライフサイクル、データベーススキーマ、ORMマッピングは自然に同期しています。

ここで、同じクラスをAPIで使用して、消費する第三者に渡したいとします。 HibernateアノテーションはAPIに漏れます。これは、そのクラスとデータベースのライフサイクルが同じではないためです。そこで、マッピングツールを使用して、システム内のBeanのレイヤー間を変換します。

私はライフサイクルについて考えようとします。ライフサイクルのミスマッチを引き起こす可能性のあるアノテーションは避けるべきです。いくつかの注釈はこの点で比較的無害であり、いくつかは隠された危険です。

悪い注釈の例: ORMマッピング、データベース構成、デプロイメント環境によって異なる項目のハードコード化された設定、コンテキストによって異なる確認があります。

無害注釈の例: RESTエンドポイント定義、JSON/XMLシリアル化、常に適用される検証。

関連する問題