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に; // コードのオミット一部 }