ホームページ > Java > &#&チュートリアル > SpringBoot/Spring AOP のデフォルトの動的プロキシ メソッドは何ですか?

SpringBoot/Spring AOP のデフォルトの動的プロキシ メソッドは何ですか?

王林
リリース: 2023-05-10 15:52:18
転載
3199 人が閲覧しました

1. springboot 2.x 以降

SpringBoot 2.x では、AOP はデフォルトで Cglib を使用して実装されますが、Spring 5 では引き続き jdk ダイナミック プロキシがデフォルトで使用されます。 Spring AOP はデフォルトで JDK ダイナミック プロキシを使用します。オブジェクトがインターフェイスを実装していない場合は、CGLIB プロキシが使用されます。もちろん、CGLIB プロキシの使用を強制することも可能です。

SpringBoot では、AOP は AopAutoConfiguration を通じて自動的に組み立てられます。

SpringBoot/Spring AOP のデフォルトの動的プロキシ メソッドは何ですか?

2. Springboot 1.xx

Springboot 1.x AOPデフォルトではまだ JDK 動的プロキシを使用します

SpringBoot/Spring AOP のデフォルトの動的プロキシ メソッドは何ですか?

3. SpringBoot 2.x はデフォルトで Cglib を使用する理由

JDK 動的プロキシはインターフェイスに基づいているため、プロキシが生成されます。 オブジェクトはインターフェイス変数にのみ割り当てることができます。 JDK ダイナミック プロキシは、Proxy.newProxyInstance() を使用してプロキシ実装クラスを作成します。ただし、2 番目のパラメータにはインターフェイス タイプが必要です。インターフェイス タイプがない場合は、エラーが報告されます。

Proxy.newProxyInstance(iCustomerInstance.getClass().getClassLoader(), iCustomerInstance.getClass().getInterfaces(), this);
ログイン後にコピー

CGLIB にはこの問題はありません。 CGLIB はサブクラスを生成することによって実装されるため、プロキシ オブジェクトがインターフェイスに割り当てられているか実装クラスに割り当てられているかに関係なく、両方ともプロキシ オブジェクトの親クラスになります。

したがって、バージョン 2.x 以降では、AOP のデフォルトの実装が CGLIB プロキシに変更されます。

新しいインターフェイスを作成します

public interface ICustomService {
    void printf();
}
ログイン後にコピー

ICustomService の新しい実装クラスを作成します

@Service
public class CustomServiceImpl implements ICustomService {
 
    public void printf() {
 
    }
}
ログイン後にコピー

インターフェイスを実装しない別のクラスを追加します

@Service
public class CustomNoImpl {
 
    public void hello() {
        
    }
}
ログイン後にコピー

次に、 ICustomService と CustomNoImpl を使用すると、AOP プロキシが CGLIB の動的プロキシを使用していることがわかります。

SpringBoot/Spring AOP のデフォルトの動的プロキシ メソッドは何ですか?

次に、application.properties 構成を通じて、デフォルトでプロキシを JDK プロキシに設定します。

spring.aop.proxy-target-class=false
ログイン後にコピー

次にデバッグを開始したところ、CustomNoImpl はインターフェイスを実装していないため CGLIB によって生成されたプロキシを使用していることがわかりました。一方、

customService にはインターフェイスが実装されているため、JDK# の動的プロキシを使用していることがわかりました。

SpringBoot/Spring AOP のデフォルトの動的プロキシ メソッドは何ですか?##

以上がSpringBoot/Spring AOP のデフォルトの動的プロキシ メソッドは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート