AOPソースコード解析と実装の概要

AOP:[ダイナミック]エージェント:

 プログラミングの指定された場所の指定方法を実行するためのコードの断片に切断され、プログラムの実行中に動的に意味します。

図1は、AOPのモジュールを導入する工程と、スプリングAOP:(春側面)
 2を、ビジネス・ロジック・クラス(MathCalculator)を定義し、ビジネスロジック動作(メソッドの前に、この方法は、異常な、XXXによって実行終了)印刷を行うログインするとき
 3。クラスカットログ(LogAspects)を定義:メソッドはMathCalculator.divは、次に実行ダイナミックセンス動作を必要とするクラス手段と

 

 通知方法:
 事前通知(@Before):logStart:ターゲットメソッドの前に実行されている(DIV)を実行する
 アドバイス(@After)後:logEnd:実行している(正常または異常な方法は、ターゲットメソッドの終了後に終了したか否か(DIV)ラン)
 通知(@AfterReturning)を返し:logReturn:実行はターゲットメソッドの後(DIV)は、通常返し
 たlogException:例外通知(@AfterThrowing)の異常動作は(DIV)ターゲットメソッドで発生した後
 ダイナミック剤、マニュアル:アドバイス(@Around)の周り操作方法(joinPoint.procced())の目的を促進

 図4に示すように、いつでも実行するターゲット・クラス・ラベルを切断する方法(通知注釈)。

 図5に示すように、切断型及びビジネスロジッククラス(クラスターゲットメソッド)を容器に添加します。

 :6、スプリングは、クラスセクション(@Aspect注釈クラスを追加する区間)であるクラス伝える必要があり
 カナダ@EnableAspectJAutoProxyクラスコンフィギュレーション[AOPオープンアノテーションベースのモデル]を、[7]

 春に多く@EnableXXX;

 三段階:
 1)、およびビジネス・ロジック・コンポーネントを切断し、容器クラスに追加され、クラス(@Aspect)切断されたスプリングを伝える
 、2)クラスの各セクションの通知方法をラベリング通知注釈、春が言ったとき、どこで(ポイントカット表現)を実行するための
 3)、アノテーションベースのAOPモードを開くには、@EnableAspectJAutoProxy

 AOPの原理は:[コンテナはコンポーネントが登録されているかを確認するために、このコンポーネントの作業をする場合、このコンポーネントどのような機能?]
 @EnableAspectJAutoProxy;
 1、何EnableAspectJAutoProxyその@?
 @import(AspectJAutoProxyRegistrar.class):AspectJAutoProxyRegistrarを容器に導入
 Beanにカスタム登録AspectJAutoProxyRegistrar容器を用い、BeanDefinetion
 internalAutoProxyCreator = AnnotationAwareAspectJAutoProxyCreator

 容器AnnotationAwareAspectJAutoProxyCreatorを登録する;

 2、AnnotationAwareAspectJAutoProxyCreator:
 AnnotationAwareAspectJAutoProxyCreator
 - > AspectJAwareAdvisorAutoProxyCreator
 - > AbstractAdvisorAutoProxyCreator
 - > AbstractAutoProxyCreator
 実装SmartInstantiationAwareBeanPostProcessor、BeanFactoryAwareの
 懸念ポストプロセッサ(初期化が完了豆で前後に何かをする)、自動化されたアセンブリたBeanFactory

 AbstractAutoProxyCreator.setBeanFactory()
 AbstractAutoProxyCreator論理後処理;.

 AbstractAdvisorAutoProxyCreator.setBeanFactory() - " initBeanFactory()

 AnnotationAwareAspectJAutoProxyCreator.initBeanFactory()


 工程:
 1)、着信構成クラス、IOCコンテナの作成
 、2)、コンフィギュレーション・レジスタ・クラスは(リフレッシュを呼び出す)が容器リフレッシュ
 。3)、registerBeanPostProcessors(たBeanFactory);ポストレジスタBeanを傍受は、Beanを作成容易にするために、
 1)、第IOCコンテナを得る既に全てBeanPostProcessor定義されているオブジェクトを作成する必要がある
 2)を、別の容器を追加するBeanPostProcessor
 3)、サンライズはBeanPostProcessor PriorityOrderedインタフェースを実現し;
 4)、次いでBeanPostProcessor順序付きインターフェースを登録血管を達成するために、
 5)、優先登録がBeanPostProcessorインタフェースを実現しなかった;
 6)、登録BeanPostProcessorは、実際には、コンテナに格納されているBeanPostProcessorオブジェクトを作成することです。
 

作成internalAutoProxyCreator BeanPostProcessorがAnnotationAwareAspectJAutoProxyCreator] [
 1)、Beanのインスタンスを作成する
 2)、populateBean;豆の様々な特性に割り当てられた
 3)、initializeBean:豆を初期化する;
 1)、invokeAwareMethods():認識コールバックインターフェース処理方法
 2)、 applyBeanPostProcessorsBeforeInitialization():postProcessBeforeInitializationアプリケーションポストプロセッサ()
 3)、invokeInitMethods()で定義された自己の初期化方法行う。
 4)、applyBeanPostProcessorsAfterInitialization(); postProcessAfterInitializationは後処理を実行();
 4)、BeanPostProcessor(AnnotationAwareAspectJAutoProxyCreator)。 「aspectJAdvisorsBuilder - ;正常に作成され
 7)、BeanPostProcessorがたBeanFactoryに登録;
 ; beanFactory.addBeanPostProcessor(ポストプロセッサ)
 プロセスが=======これらが作成され、========のAnnotationAwareAspectJAutoProxyCreatorを登録されています

 = AnnotationAwareAspectJAutoProxyCreator> InstantiationAwareBeanPostProcessor
 4)、finishBeanFactoryInitialization(たBeanFactory);たBeanFactoryは初期化を完了し、豆の残りの単一のインスタンスを作成する。
 1)、容器を横断するオブジェクトgetBean(のbeanName)を作成順に、すべての豆を取得する;
 getBean-> doGetBean() - > getSingleton() - >
 2)、Beanを作成するには、
 [AnnotationAwareAspectJAutoProxyCreatorはすべての創造の前に傍受するBeanを持って、InstantiationAwareBeanPostProcessor、()postProcessBeforeInstantiationを呼び出す]
 そのBeanを示し、あなたが得ることができる場合1)、現在のBean既存のキャッシュを得るために、直接使用することによって作成される前に、または再作成、
 ちょうど良いBeanがキャッシュされるの作成
 2)、たcreateBean(); Beanを作成し、
 AnnotationAwareAspectJAutoProxyCreatorは、第Beanインスタンスに復帰しようとする任意の豆を作成する前に
 [Bean内BeanPostProcessor ]初期化呼び出しの前と後に作成されたオブジェクトは、
 [InstantiationAwareBeanPostProcessorプロセッサは] Beanインスタンスを作成する前に、オブジェクトの最初の試みの後に返すように設定されています
 1)、resolveBeforeInstantiation(のbeanName、mbdToUse ); BeforeInstantiation解析
 本明細書中に所望の後処理がプロキシオブジェクトを返すことができる。続けるにはない場合、エージェントは、使用するオブジェクトを返すことができる場合は
 1)、最初のポストプロセッサは、オブジェクトを返そうと、
 豆= applyBeanPostProcessorsBeforeInstantiation():
 InstantiationAwareBeanPostProcessor場合、すべてのポストプロセッサを得る;
 実装postProcessBeforeInstantiation
 IF(!豆= NULL){
豆= applyBeanPostProcessorsAfterInitialization(豆、のbeanName);
}

 2)、doCreateBean(のbeanName、mbdToUse、引数)。 ; 3.6プロセスと同じと、Beanインスタンスを作成する真
 3)、


 AnnotationAwareAspectJAutoProxyCreator [InstantiationAwareBeanPostProcessor]役割:
 1)の前に、各Beanが作成され、postProcessBeforeInstantiation()を呼び出し、
 ケアMathCalculatorとLogAspect作成
 1)現在のBeanを決定することです(豆を強化するために、すべての必要性を保存)でadvisedBeansで
 2)は、現在は、Bean情報、ポイントカット、アドバイザ、AopInfrastructureBeanのタイプに基づいているか否かを判断する
 ことがカットされているか否か(@Aspect)
 。3)、スキップするかどうか
 A)候補エンハンサー(通知方法内側部)を得ました[リストは<アドバイザが> candidateAdvisors]
 ;各パッケージブースター通知方法がInstantiationModelAwarePointcutAdvisorある
 真に戻り、各ブースタAspectJPointcutAdvisor型であるかどうかを決定
 常に偽に戻り、2)

 、オブジェクトを作成するために)2
 postProcessAfterInitialization;
 wrapIfNecessaryを返す(Beanを、のbeanName 、cacheKey); //もしパッケージ必要に応じて
 1)現在の拡張豆(通知方法)オブジェクト[] specificInterceptorsの全て取得する
 現在のBeanメソッドを切断する方法を見つけることの通知が要求されるブースタ候補のすべてを(見つけるために1を、 A)
 2、ブースターは、豆を得るために使用することができます。
 3、ソート強化する
 2)にadvisedBeansに電流豆を保存する;
 3)、現在のBeanは、Beanの現在のプロキシオブジェクトを作成し、強化する必要がある場合、
 1)、全てのエンハンサー(通知方法を得るために)
 2)、ProxyFactoryに保存
 3 )、プロキシオブジェクトを作成します。春の自動判定を
 JdkDynamicAopProxy(設定); JDKダイナミックプロキシ;
 ObjenesisCglibAopProxy(設定);動的プロキシのCGLIB;及び
 4)、容器をCGLIB向上プロキシオブジェクトを使用する現在のコンポーネントに返される;
 5)、得られたコンテナがこのコンポーネントの薬剤である後対象プロセスの実行は、プロキシオブジェクトは、メソッドを通知する処理を実行するオブジェクト;


 3)、ターゲットメソッドが実行され、
 コンテナは、オブジェクトの詳細を保持するプロキシオブジェクト(CGLIB増強後のオブジェクト)の成分(例えば、を保持しますエンハンサー、ターゲットオブジェクト、XXX)
 。1)、CglibAopProxy.intercept();傍受対象の方法は、実行
 2)、インターセプタチェーンの目標取得方法は、物体ProxyFactoryに従って実行される、
 リスト<オブジェクト> = this.advised.getInterceptorsAndDynamicInterceptionAdviceカテナalberghiera (方法、targetClass)
 。1)、リスト<OBJECT> 5 interceptorList全てインターセプターを保存
 デフォルトExposeInvocationInterceptorエンハンサーおよび4;
 2)、インターセプタ変換されたブースターの全てを介して、
 registry.getInterceptors(アドバイザー) ;
 リストへの3)、ブースター<メタ odInterceptor>は、
 MethodInterceptorの場合、コレクションに直接追加しました
 そうでない場合、MethodInterceptorのにAdvisorAdapterを用いてブースター、
 変換が完了リターンMethodInterceptorのアレイであり、

 いかなるインターセプタチェーン、ターゲットメソッドの直接実行がない場合3);
 インターセプタチェーン(各通知方法は、インターセプタの方法としてMethodInterceptorのの使用をパッケージ化されています機構)
 インターセプタチェーン、ターゲットオブジェクトを実行する必要がある場合4)、ターゲットメソッド、
 インターセプタチェーンCglibMethodInvocationオブジェクトを作成するための情報を渡す
 RETVAL = mi.proceedオブジェクト(およびコール);
 5)、インターセプタチェーン;手順をトリガ
 最後インターセプタに割り当てインターセプタおよびインターセプタインデックス配列-1ターゲットメソッドの実行の大きさ、またはインターセプタ()はターゲットメソッドを実行するように実行されない場合、1)、
 2)、各捕捉鎖傍受、invokeメソッドは、インターセプタを行い、次の実行のために各インターセプタインターセプタ待ち、実行が完了した後に再び戻り、
 機構インターセプタチェーン、ターゲットメソッドの実行と通知方法の順序を保証するために、

 まとめ:
 1)、AOP機能@EnableAspectJAutoProxyを開きます
 2)、@EnableAspectJAutoProxyコンテナを与えます 登録コンポーネントAnnotationAwareAspectJAutoProxyCreator
 3)、ポストプロセッサはAnnotationAwareAspectJAutoProxyCreatorである。
 4)、コンテナ作成処理:
 AnnotationAwareAspectJAutoProxyCreatorオブジェクトを作成する; 1)、registerBeanPostProcessors()ポストプロセッサレジスタ
 2)、finishBeanFactoryInitialization()は、残りの単一のインスタンスにBeanを初期化する
 )1、及びビジネス・ロジック・コンポーネント組立部作る。
 2)、AnnotationAwareAspectJAutoProxyCreatorインターセプトモジュール作成のプロセス
 、3)アセンブリが完成作成する後、成分が強調される必要があるかどうかが決定される
 次のとおり通知方法ファセット、パッケージ化エンハンサー(アドバイザ)、ビジネス・ロジック・コンポーネントにプロキシオブジェクト(CGLIB)を作成し、
 ターゲットメソッドの5)、実行:
 1)、プロキシオブジェクトの実行ターゲットメソッド
 2)、CglibAopProxy.intercept();
* 1)、ターゲットメソッドインターセプタチェーン(ブースターパッケージ化インターセプタMethodInterceptorの)として得た
2)、インターセプタチェーン機構を用いて、各インターセプタに変更*実行;
* 3)の効果:
*正常に行わ:事前通知- 「ターゲットメソッド- 」後方通知- 「復帰通知
*異常:事前通知- 」ターゲットメソッド- 「後方通知- 」異常通知

 

おすすめ

転載: www.cnblogs.com/studygithub5208868/p/11300643.html