4

概要
使用方法

  • Spring 3.0.1 (アノテーション構成)
    • 現在の構成では、プロキシ作成者として CGLib を使用していますが、これは私の好みではありません
    • トランザクションは、特別な設定なしで構成されたアノテーションです
    • すべての構成は、注釈 ( @Service@Transactional@ManagedResource@Injectなど)で行われます。
  • Hibernate 3.5 (エンティティには javax.persistence のアノテーションが付けられます)

ガイドラインのハイライト

  • アノテーションが付けられた、@Repositoryまたは@Serviceインターフェイスが必要なすべての Bean
  • コンストラクタ DI (再構成が不要な場合)
    • コンストラクターにはデフォルトの可視性があります ( Foo(Bar bar) {...})
  • Bean フィールドはfinalです (再構成が不要な場合)
    • デフォルトのコンストラクターがありません
  • 実装は、最終修飾子 ( )を使用してデフォルトで表示されますfinal class Foo

問題

  1. CGLib は最終クラスをプロキシできません
  2. CGLib にはデフォルト (空の) コンストラクターが必要です
  3. 一部のサービスは JMX 経由で公開する必要があります
  4. CGLib によってプロキシされない限り、MBean エクスポータが機能しない
  5. 一部@Transactional @Serviceの は、ファサード トランザクションに複数のサービスを含める必要があるファサード サービスを介してアクセスされます (例: 2 つのアプリケーション コンポーネントに対するオブザーバー サービス)。
  6. 一部のインターフェースには複数の実装があります (現在は で区別されています@Qualifier) 。
  7. 将来のガイドライン (または機能があると便利) - 各アプリケーション モジュールにはbeanRefContext.xml、内部アプリケーション コンテキストを構成するためのファイルがあります。

XML 構成を使用していたときは、上記のすべてのガイドラインを適用できましたが、注釈に切り替えると、Spring が正しく動作していないように見えます。
私のグループの開発者は、アノテーション構成を好みます (新しいコードを配線して記述する方が簡単なようです) が、Spring アプリケーション コンテキスト エラーの処理を防ぐためにコードに導入されたあらゆる種類の「ハック」に気付きました。

質問)

  1. アノテーション構成を使用する際に従うべきベストプラクティスはありますか?
    • インターフェースごとに複数の実装を使用する場合 (@Primaryまたはの使用を減らしようとしている@Qualifier)
    • 使用時@Transactional
    • 使用時@ManagedResource
    • 上記を組み合わせて使用​​する場合
  2. CGLib の使用を停止し、アノテーション構成を保持したまま、アノテーション付きの MBean をエクスポートできる方法はありますか?
  3. 私のガイドラインのほとんど (できればすべて) を維持するための適切な実装は何ですか?
4

2 に答える 2

3

設計ガイドラインを適用し、注釈ベースの構成を使用し続けることができるように、(質問 #2 と #3 に対して) 次の解決策を思いつきました。

  • 各依存プロジェクト (Maven モジュール) には独自のプロジェクトがありますApplicationContext
  • すべての依存プロジェクト アプリケーション コンテキストは、beanRefContext.xml
  • これらのアプリケーション コンテキストは、Spring コンテキスト階層メカニズムを使用して階層に読み込まれます。
    • このステップは実際には Spring によって完全にサポートされておらず、追加の作業が必要です
  • 私のアプリケーションは階層化されているので、JMX レイヤー以外のすべてのモジュールで CGLib を無効にすることができました (私はそれを使用できます :-) )。

上記の手順により、Spring 対応テストの実行時間を短縮することもできました (すべてのモジュールが Bean のサブセットのみをロードしました)。

実用的なガイドラインとして (質問 1 の場合)、インターフェイスに複数の実装がある場合@Primary、広く使用されているものを配置し、別の実装を必要とする他のクライアントに配置し、 を使用して Bean を配線します@Qualifier

于 2010-12-09T08:11:58.597 に答える
1

ポイント 2 への回答) CGLib の代わりに AspectJ を使用できます。

于 2010-11-30T18:52:40.337 に答える