web-dev-qa-db-ja.com

SpringFrameworkでプロキシ(動的プロキシ)を使用する意味は何ですか?

春にプロキシを使う意味がわかりません。何が効率的ですか?

18
Linh

動的プロキシ はJDKの機能です。 呼び出しハンドラー を使用してインターフェースを実装するために使用できます。

動的プロキシクラス(以下では単にプロキシクラスと呼びます)は、クラスの作成時に実行時に指定されるインターフェイスのリストを実装するクラスであり、以下に説明する動作をします。プロキシインターフェイスは、プロキシクラスによって実装されるインターフェイスです。プロキシインスタンスは、プロキシクラスのインスタンスです。各プロキシインスタンスには、インターフェイスInvocationHandlerを実装する呼び出しハンドラオブジェクトが関連付けられています。

動的プロキシにはいくらかのオーバーヘッドがあります。ただし、ほとんどのユースケースでは、オーバーヘッドは重要ではありません。本当の問題は、動的プロキシを(過剰に)使用すると、アプリケーションの理解とデバッグが困難になることです。たとえば、動的プロキシは、スタックトレースに複数の行とともに表示されます。

動的プロキシは、 デコレータ を実装するためによく使用されます。この一例は、SpringのAOPです。 (私は [〜#〜] aop [〜#〜] の詳細には立ち入りたくありませんし、物事を単純にするためにAOP用語を使用しません)。特定の懸念事項が1つのクラスに実装され、多くの場所で使用されている場合。動的プロキシ(および呼び出しハンドラー)は、メソッド呼び出しをインターセプトするためのグルーコード(Springによって提供される)のみです。 (実際には、動的プロキシはこの機能の実装の詳細にすぎません。オンザフライでクラスを生成することは、それを実装するもう1つの可能性です。)

18
Thomas Jung

プロキシは [〜#〜] aop [〜#〜] によって使用されます。要するに:

通常は持っています。

Caller --> Real object

しかし、たとえば、自動トランザクション管理が必要な場合、Springは実際のオブジェクトのプロキシを配置します

Caller --> Proxy --> Real object

プロキシがトランザクションを開始する場所。

ここに素晴らしい記事があります プロキシの本質と春のそれらの効率(パフォーマンス)の両方を説明します

51
Bozho

ソース/バイトコードを変更するか、追加の機能を埋め込み、基になるオブジェクトに呼び出しを委任するサブクラスまたはプロキシを使用することにより、Javaクラスに機能を追加できます。

1

AOPはCGLIBプロキシも使用できます。これは、インターフェースの代わりにクラスをプロキシするために使用されます。

0
Nilesh

他の答えは良いですが、これが私が非常に簡単な言葉でそれをどう考えるかです。

  1. 注釈は、「余分な動作のために隠しコードを追加する」ことを意味します。
  2. フレームワーク(またはアノテーションの意味を知っているもの)は、バイトコード、実行時のSpring、コンパイル時のAspectJなどを追加します。
  3. インターセプターとともにプロキシとしてコードを追加します。 (ラッパー、デコレータ、アダプタは類似しており、「プロキシ」よりも理解しやすい場合があります。)
  4. プログラムが実行されると、インターセプターはその処理を実行するプロキシに実行を送信します。プロキシは、コーディングしたクラスに実行を送信する場合と送信しない場合があり、「ラップ」します。
0
allenjom

Spring AOPは、JDK動的プロキシまたはCGLIBのいずれかを使用して、特定のターゲットオブジェクトのプロキシを作成します。 (選択肢がある場合は常に、JDK動的プロキシが推奨されます)。プロキシされるターゲットオブジェクトが少なくとも1つのインターフェイスを実装している場合、JDK動的プロキシが使用されます。ターゲットタイプによって実装されるすべてのインターフェイスがプロキシされます。ターゲットオブジェクトがインターフェイスを実装していない場合は、CGLIBプロキシが作成されます。

0
Pramod Gautam