33

私は現在Springについて読んでおり、AOPの使用に使用される例の1つは、メソッド呼び出しの開始と終了をログに記録することです。

また、AOPを使用するとパフォーマンスに影響を与える可能性があることも読みました。

Spring AOPを使用することは、このタイプのロギングに適していますか?私の理解では、Springは動的AOPを使用しますが、このタイプのAOPには静的AOP(AspectJのような)を使用する方がよいでしょう。

現在、私が働いている会社のコーディングポリシーでは、ばかげた量のロギングが必要です。作成する必要のあるロギングコードの量を減らし、コードの可読性を向上させたいと考えています。

私は間違った木を吠えていますか?

4

3 に答える 3

41

ロギングの実装に Spring AOP を使用したので、観察結果を共有します。

  • パフォーマンスへの影響は十分ではなく、ロギング自体の影響よりも小さい
  • Spring 構成でアスペクトを構成すると、必要に応じてロギング コードを完全に無効にすることができます。
  • スタック トレースがかなり長くなると、デバッグがより問題になります。
  • そのような決定は、設計に十分に影響します。たくさんのインターフェイスとアスペクト クラスを取得するだけでなく、プロダクション クラスは非常に「薄い」必要があります。非パブリック メソッドの呼び出しをインターセプトできないことを忘れないでください。自己呼び出し (パブリック メソッドであっても) もインターセプトできず ( thisAOP によってラップされたハンドルではなくネイキッド ハンドルで作業しているため)、ログに記録できません。そのため、すべてのロギングはインターフェイス境界でのみ発生します。(これは、プロキシベースのアスペクト ウィービングの使用に関するものです。cglib を使用したランタイム サブクラス化のオプションがありますが、私は使用しませんでした)
  • ポイントカットの記述は非常に難しい場合があります。IntelliJ Idea は、どのメソッドがポイントカットによってアドバイスされるかを決定するのに大いに役立ちます。
  • 一般的に、私はこのアプローチが好きで、使用する価値があると思いますが、予想よりもはるかに複雑に見えました
于 2010-01-15T11:52:55.277 に答える
17

パフォーマンスに関する懸念事項については、このブログ投稿をお読みください。

AOP の考え方は、提供される機能上のメリットを第一に考えることです。自動ロギングが要件であり、AOP がそれに適合する場合は、それを選択してください。

とはいえ、もちろん、きめの細かいロギングが必要な場合は、読み込み時のウィービングが優先されます。

于 2010-01-15T11:45:06.723 に答える
3

私はこのブログ投稿で説明されている方法と同じようにそれを行いました。これは私が見つけた最高のものであり、AOPを使用する場合と使用しない場合の違いをうまく示すサンプルもあります。

永続性を備えたエラー管理のように、ログを記録するよりももっと凝ったことをしているのでない限り、それは価値がありません。適切な例外階層(ドメイン、システム)があり、ロギング境界を適切に設定している場合、ロギングコードを大幅に削減することはできません。

于 2011-07-20T12:39:13.600 に答える