春にプロキシを使う意味がわかりません。何が効率的ですか?
5 に答える
プロキシはAOPによって使用されます。要するに:
通常は持っています。
Caller --> Real object
しかし、たとえば、自動トランザクション管理が必要な場合、Springは実際のオブジェクトのプロキシを配置します
Caller --> Proxy --> Real object
プロキシがトランザクションを開始する場所。
プロキシの本質と春の効率(パフォーマンス)の両方を説明する素晴らしい記事があります
動的プロキシはJDKの機能です。呼び出しハンドラーを使用してインターフェースを実装するために使用できます。
動的プロキシクラス(以下では単にプロキシクラスと呼びます)は、クラスの作成時に実行時に指定されるインターフェイスのリストを実装するクラスであり、以下に説明する動作をします。プロキシインターフェイスは、プロキシクラスによって実装されるインターフェイスです。プロキシインスタンスは、プロキシクラスのインスタンスです。各プロキシインスタンスには、InvocationHandlerインターフェイスを実装する呼び出しハンドラオブジェクトが関連付けられています。
動的プロキシにはいくらかのオーバーヘッドがあります。ただし、ほとんどのユースケースでは、オーバーヘッドは重要ではありません。本当の問題は、動的プロキシを(過剰に)使用すると、アプリケーションの理解とデバッグが困難になることです。たとえば、動的プロキシは、スタックトレースに複数の行とともに表示されます。
動的プロキシは、デコレータを実装するためによく使用されます。この一例は、SpringのAOPです。(私はAOPの詳細には立ち入りたくありませんし、物事を単純にするためにAOPの用語を使用しません)。特定の懸念事項が1つのクラスに実装され、多くの場所で使用されている場合。動的プロキシ(および呼び出しハンドラー)は、メソッド呼び出しをインターセプトするためのグルーコード(Springによって提供される)のみです。(実際には、動的プロキシはこの機能の実装の詳細にすぎません。その場でクラスを生成することは、それを実装するもう1つの可能性です。)
ソース/バイトコードを変更するか、追加機能を埋め込み、基になるオブジェクトへの呼び出しを委任するサブクラスまたはプロキシを使用することにより、Javaクラスに機能を追加できます。
AOPはCGLIBプロキシも使用できます。これは、インターフェースの代わりにクラスをプロキシするために使用されます。
他の答えは良いですが、これが私が非常に簡単な言葉でそれをどう考えるかです。
- 注釈は、「余分な動作のために隠しコードを追加する」ことを意味します。
- フレームワーク(またはアノテーションの意味を知っているもの)は、たとえば、実行時にSpring、コンパイル時にAspectJなどのバイトコードを追加します。
- インターセプターとともにプロキシとしてコードを追加します。(ラッパー、デコレーター、アダプターは類似しており、「プロキシ」よりも理解しやすい場合があります。)
- プログラムが実行されると、インターセプターはその処理を実行するプロキシに実行を送信します。プロキシは、コーディングしたクラスに実行を送信する場合と送信しない場合があり、「ラップ」します。