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