SpringノートSpringのAOPサポート


AOPプログラミングを見渡すと、プログラマーが参加する必要があるのは3つの部分だけです.
  • 一般的なビジネスコンポーネント
  • を定義する.
  • は、1つの切り込みポイントが複数のビジネスコンポーネント
  • を横切る可能性がある切り込みポイントを定義する.
  • 定義強化処理:強化処理は、AOPフレームワークにおいて通常のビジネスコンポーネントに織り込む処理動作
  • である.
    プロキシオブジェクトのメソッド=プロキシオブジェクトのメソッド+拡張処理
     
    次に、SpringのAOP構成を記録します
    <?xml version="1.0" encoding="UTF-8"?>
    <beans ......
    	xmlns:aop="http://www.springframework.org/schema/aop"
    	xsi:schemaLocation="......
    			http://www.springframework.org/schema/aop
    			http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
    	
    	<!--   @AspectJ   -->
    	<aop:aspectj-autoproxy/>
    	
    	<!--       Spring XML Schema    ,    Spring              @AspectJ   -->
    	<!--<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"/>-->
    	
    </beans>

     Springアプリケーションで@AspectJサポートを開始するには、アプリケーションのクラスパスに2つのAspectJライブラリを追加する必要があります:aspectjweaver.jarとaspectjrt.jar、バイトはAspectJインストールパスのlibディレクトリの下の2つのJARファイルを使用します.
     
    1.切断面Beanの定義
    @AspectJを使用してJavaクラスをマークします.Javaクラスは断面Beanとして使用されます.
    2、Before強化処理の定義
    package com.zhao.aopdemo;
    
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    
    
    @Aspect
    public class BeforeAdviceTest {
    
    	@Before("execution(* com.zhao.aopdemo.*.say*(..))")
    	public void beforeSay()
    	{
    		System.out.println("Before say...");
    	}
    }
    

     
    //Beforeコメント
    @Before("execution(* com.zhao.aopdemo.*.say*(..))")
    解釈:com.zhao.aopdemoパッケージの下のすべてのクラスのsayで始まる方法
    3、AfterReturning強化処理の定義
    package com.zhao.aopdemo;
    
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Aspect;
    
    @Aspect
    public class AfterReturningAdviceTest {
    
    	@AfterReturning(returning = "word", pointcut = "execution(* com.zhao.aopdemo.*.say*(..))")
    	public void afterReturningSay(Object word) {
    		System.out.println("After Returning say..." + word);
    	}
    }
    

     @AfterReturningを使用する場合、拡張処理方法afterReturningSayでwordという名前のパラメータを使用できることを示します.このパラメータは、ターゲットが送信した戻り値を表します.
    4、AfterThrowing強化処理
    package com.zhao.aopdemo;
    
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Aspect;
    
    @Aspect
    public class AfterThrowingTest {
    	@AfterThrowing(throwing = "ex", pointcut = "execution(* com.zhao.aopdemo.*.say*(..))")
    	public void afterThrowingSay(Throwable ex) {
    		System.out.println("        :" + ex);
    	}
    }
    

     出力:
    Before say...
    ターゲットクラスからの例外:java.lang.ArithmeticException:/by zero
    Exception in thread "main"java.lang.ArithmeticException:/by zero
    at com.zhao.aopdemo.Chinese.sayThrowable(Chinese.java:21)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    ......
    メインプログラムは終了しました
    ここでafterThrowingSayメソッドのパラメータタイプをNull PointerException異常に置き換えると、この切り込み点はNull PointerException異常のみに一致する
     
    5、After強化処理
    Springでは、AfterReturning強化処理と少し似ていますが、違いもあります.
  • AfterReturning強化処理は、目標方法が正常に完了する後にのみ、
  • に織り込まれる.
  • Afterエンハンスメント処理は、ターゲットメソッドがどのように終了するか(成功完了と異常終了の両方を含む)にかかわらず、
  • に織り込まれる.
    6、Around強化処理
    未完待続...