A、春AOPの導入
第二には、スプリングAOPと達成するものです
スプリングAOPプログラミング指向、オブジェクト指向プログラミングは、トランザクション管理、ロギング、キャッシングなどの処理システムに分散懸念を、横断的モジュールごとに補足です。これは、動的プロキシの使用メモリにAOPメソッドの仮目標を生成し、このオブジェクトは、ターゲットオブジェクトのすべての方法は、ポイントカットオフ特異的に強調処理を行う含まれており、元のコールバックメソッド。
春AOP動的プロキシ達成するために、主に二つの方法がありますが、JDKの動的プロキシとCGLIBのダイナミックプロキシ。JDKの動的プロキシは、プロキシクラスで反射されたが、プロキシクラスがインターフェイスを実装する必要があり、そしてコアはのInvocationHandlerプロキシクラスで受信します。動的プロキシを行うには、継承の方法によってCGLIB実装インタフェースは、一般的に何のクラスではありません、CGLIBは、コード生成ライブラリです、あなたが動的ので、実行時にクラスのサブクラスを生成することができることを動的プロキシクラス、CGLIBを、そうであればクラスはfinalとしてマークされ、それがダイナミックCGLIBエージェントのために使用することはできません。
春AOPの実現
ここで春AOPプロキシの実装ロジックを使用した方法org.springframework.aop.framework.DefaultAopProxyFactoryの実現。
パッケージorg.springframework.aop.framework。 インポートしたjava.io.Serializable; 輸入java.lang.reflect.Proxyの; 輸入org.springframework.aop.SpringProxy; @SuppressWarnings( "シリアル" ) パブリック クラス DefaultAopProxyFactory 実装AopProxyFactory、シリアライズ{ @Override 公共 AopProxy createAopProxy(AdvisedSupport設定)スローAopConfigException { 場合(config.isOptimize()|| config.isProxyTargetClass()|| hasNoUserSuppliedProxyInterfaces(設定))を{ クラス <?> targetClass =config.getTargetClass(); IF(targetClass == nullの){ スロー 新しい新しい AopConfigExceptionは(「TargetSourceは、ターゲットクラスを決定することはできません:」+ 「ターゲットまたはいずれかのインターフェイスANは、プロキシの作成のために必要であることを」。); } // 判断がインターフェイスである場合またはクラス、使用JDKの動的プロキシプロキシ IF(targetClass.isInterface()|| Proxy.isProxyClass(targetClassが)){ 戻り 新しい新しいJdkDynamicAopProxy(設定する); } // 他CGLIBの動的プロキシと(インタフェースを実装しませんクラス) を返す 新しい新しいObjenesisCglibAopProxy(設定を); } 他{ // デフォルトのJDK動的プロキシ 戻り 新しい新しいJdkDynamicAopProxy(設定); } } / ** * {設け決定@link だけ}かどうAdvisedSupport * {指定@link org.springframework.aop.SpringProxyインタフェース}を *(または代理店)インターフェイスを指定しませんでした。 * / プライベート ブールhasNoUserSuppliedProxyInterfaces(AdvisedSupport設定){ クラス [] = IFCS <?> config.getProxiedInterfaces(); 戻り。。(Ifcs.length == 0 ||(1 && == SpringProxy ifcs.length クラス .isAssignableFrom(IFCS [ 0 ]))); } }
図2、春AOPクラス構造。
プロセスは、コアのInvocationHandlerインタフェースのinvoke()メソッドであります
三、AOP用語