SpringAop JDKの動的プロキシを呼び出しますか?CGLIBを呼び出すとき

 

1.インポートあるlog4j.jar、オープンlog4jのデバッグモード

 

2.あなたは、重要なメッセージを見つけることができ、印刷ログを確認します。

2020年3月3日15:13:31870 DEBUG [org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreatorは]  -  0共通インターセプタ、4つの特定インターセプタと 'UserServiceの' Beanの暗黙のプロキシを作成します

スプリングメソッドAnnotationAwareAspectJAutoProxyCreatorクラスを行うときにAOPを行い、

 
AnnotationAwareAspectJAutoProxyCreator 3.親クラスAbstractAutoProxyCreatorアドバイザ究極[]は保護見つけるために実行される buildAdvisors(のbeanName文字列、オブジェクト[] specificInterceptors)メソッド  

 

4.再buildAdvisorsは  、このメソッドのブレークポイントをデバッグ 

 

5.AbstractAutoProxyCreatorの クラスはcreateProxyは、以下の重要な方法を持っていることが分かりました。

保護されたオブジェクトcreateProxy(
    クラス <?> たbeanClass、文字列のbeanName、オブジェクト[] specificInterceptors、TargetSource targetSource){ 

    場合この .beanFactory instanceofのConfigurableListableBeanFactory){ 
        AutoProxyUtils.exposeTargetClass((ConfigurableListableBeanFactory)この.beanFactory、のbeanName、たbeanClass)。
    } 

    ProxyFactory proxyFactory = 新しいProxyFactory()。
    proxyFactory.copyFrom(この); 

    もし(!proxyFactory.isProxyTargetClass()){
         場合(shouldProxyTargetClass(たbeanClass、のbeanName)){
            proxyFactory.setProxyTargetClass(真の); 
        } 
        { 
            evaluateProxyInterfaces(たbeanClass、proxyFactory)。
        } 
    } 

    アドバイザ[]顧問 = buildAdvisors(のbeanName、specificInterceptors)。
    proxyFactory.addAdvisors(顧問); 
    proxyFactory.setTargetSource(targetSource)。
    customizeProxyFactory(proxyFactory)。

    proxyFactory.setFrozen(この.freezeProxy)。
    もし(advisorsPreFiltered()){ 
        proxyFactory.setPreFiltered()。
    } 
    // 核心代码
    リターン proxyFactory.getProxy(getProxyClassLoader())。
}

 

方法は、次にProxyFactoryにgetProxyを進行します

パブリックオブジェクトザgetProxy(のClassLoaderクラスローダ){
     // createAopProxy決意方法がJDK動的プロキシモードまたはプロキシCGLIBの選択された
    リターンcreateAopProxyを()getProxy(クラスローダ);. 
}

 

方法は、次にProxyCreatorSupportにcreateAopProxyに移ります

保護された 最終的な 同期AOPProxy createAopProxy(){
     IF(!{.active)
        アクティベート(); 
    } 
    // getAopProxyFactory()フォーカスがcreateAopProxy方法であるので、DefaultAopProxyFactoryオブジェクトを返す
    返す getAopProxyFactory()createAopProxyを(この); 
}

 

6.ゴーcreateAopProxy DefaultAopProxyFactoryクラスメソッドに、この方法では、JDKの動的プロキシまたはプロキシCGLIBを選択する方法であります

@Override
 公共 AopProxy createAopProxy(AdvisedSupport設定)がスローAopConfigException {
     // 默认、1.config.isProxyTargetClass()代表配置中的プロキシターゲットクラス属性真/偽の偽
     //  
    場合(config.isOptimize()||設定します。 isProxyTargetClass()|| hasNoUserSuppliedProxyInterfaces(設定)){
         // 目标代理类、如com.service.impl.UserServiceImpl 
        クラスtargetClass = <?> config.getTargetClass();
        場合(targetClass == nullの){
             スロー 新しい AopConfigExceptionを( "TargetSourceは、ターゲットクラスを決定することはできません:" + 
                                         「インターフェイスまたはターゲットは、プロキシの作成に必要です。」); 
        } 
        // ターゲットクラスインターフェースまたは場合である
        IF(targetClass.isInterface()|| Proxy.isProxyClass(targetClass)){
             戻り 新しい新しいJdkDynamicAopProxy(設定する); 
        } 
        戻り 新しい新しいObjenesisCglibAopProxy(設定); 
    } 
    {
         戻り 新しい新しいJdkDynamicAopProxy(設定); 
    } 
}

 

この方法は、AdvisedSupportタイプ設定パラメータであり、AdvisedSupport ProxyConfigは、クラスを継承しました

パブリック クラス ProxyConfigの実装Serializableの{
     // 代表代行対象クラスコンフィギュレーション、プロキシCGLIBの真の、使用に設定されている場合
    プライベート ブール = proxyTargetClass falseに

    プライベート ブール最適化= falseに

    ブール不透明= falseに

    ブール exposeProxy = falseに

    プライベート ブール冷凍= falseに; 

    // コードのオミット一部
    
}

 

おすすめ

転載: www.cnblogs.com/caoxb/p/12406005.html