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

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

王林
王林転載
2023-05-10 15:52:183094ブラウズ

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 までご連絡ください。