SPRING学習(59) - 注釈ベースのプログラミングAOPセクション

一部AOPの態様は、XML構成プログラミングAOPの側面に加えて、XMLコンフィギュレーション・プログラムに基づいて説明するが、また、本明細書に注釈マナーAOP態様をプログラムすることによって実現することができ、この注釈は小さな例を通してプログラミング導入するAOPに基づいています。

 

 

図1は、使用中にスプリングAOPに、バネaop.jar、ばねaspects.jarだけでなくインポートするにもインポートする必要があり、そしてaspectjweaver.jar aopalliance.jarが、依存、aopalliance aspectjweaver.jarばねaspects.jarあります。ばねaop.jarジャーは、ターンスプリングaop.jarスプリングmvc.jar依存で、導入されたバネmvc.jar及びライン上ばねaspects.jar限り依存しています。

 

図2に示すように、スプリングAOP-annotion.xml

<?xmlのバージョン= " 1.0 "エンコード= " UTF-8 "?> 
<豆のxmlns = " http://www.springframework.org/schema/beans " 
    のxmlns:XSI = " http://www.w3.org / 2001 / XMLスキーマ・インスタンス" 
    のxmlns:AOP = " http://www.springframework.org/schema/aop " 
    のxmlns:コンテキスト = " http://www.springframework.org/schema/context " 
    XSI:のschemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans。XSD 
        のhttp:// www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 
        HTTP:// www.springframework.org/schema/context HTTP:// WWW .springframework.org /スキーマ/コンテキスト/春コンテキスト-4.0.xsd ">
 
    < -パッケージ構成の自動スキャン- >!
    <コンテキスト:スキャンコンポーネントベースの -package = " springAopAnnotion " > </コンテキスト:コンポーネント-スキャン> 
    < -自動カット法の種類は、プロキシオブジェクトマッチング生成する方法である- >は!。
    <AOP:AspectJの-自動プロキシ> </ AOP:AspectJの-自動プロキシ> 
</豆>

 

3、強化されたクラスSleep.java

springAopAnnotionパッケージ; 

インポートorg.springframework.stereotype.Component; 

// 実装クラスは、SpringのIOCコンテナ管理の追加 
@Component(" 眠れる森" のパブリック クラススリープ{ 

    公共 ボイドSLEEP(文字列WHO){ 
        。システムOUT .printlnを(WHO + " 眠りたいです!" ); 
    } 
}

4、クラスSleepAspect.javaを強化

springAopAnnotionパッケージ; 

インポートorg.aspectj.lang.JoinPoint; 
インポートorg.aspectj.lang.ProceedingJoinPoint; 
インポートorg.aspectj.lang.annotation.After; 
インポートorg.aspectj.lang.annotation.AfterReturning; 
インポートorg.aspectj.lang。 annotation.AfterThrowing; 
インポートorg.aspectj.lang.annotation.Around; 
インポートorg.aspectj.lang.annotation.Aspect; 
インポートorg.aspectj.lang.annotation.Before; 
インポートorg.aspectj.lang.annotation.Pointcut; 
インポートORG .springframework.stereotype.Component; 

/ * * 
 * *ポイントカット宣言の二つの方法がある
 * 1は、先にエントリポイント@Pointcutステートメントの切断方法におけるエントリポイントへの後続の参照
 * 2は、切断工程のポイントカットに直接宣言
 *      
 *カットする5つの方法があります
 * 1を、@Before前に実行する方法は、
 * @After戻る前に、メソッドを実行した後2、
 * 3、方法@afterReturningする返す
 前と4 *、方法は@Around実行
 *。5、例外をスローするとき@AfterThrowing 
 * @author qiaozhong 
 * / 
@Component 
@Aspect 
パブリック クラスSleepAspectは{ 
    
    / * * 
     *ステートメントのエントリポイント@Pointcut予め、後続エントリポイントを参照の切断方法で
     メソッドの宣言を行う前*カットポイント
     * / 
    @Pointcut(" 実行(springAopAnnotion.Sleep *。*(..))" 公共 ボイドbeforeMethod(){} 
    
    / * * 
     事前に切断*ステートメントポイント@PointCut、その後の参照の切断プロセスにおけるエントリポイント
     メソッドの宣言を行った後*接点
     * / 
    @Pointcut(実行(springAopAnnotion.Sleep *。*(..))" パブリック ボイドafterMethod(){} 
    
    / * * 
     *メソッドを実行する前に、本方法はbeforeMethod宣言()のためのエントリー・ポイントの前に、製織を切断する
     * @paramジョインポイント
     * / 
    @Before(" beforeMethod()" 公共 ボイドbeforeAspect(ジョインポイントジョインポイント){ 
        システム。OUT .println(" メソッドを実行する前に、パラメータ= " + joinPoint.getArgs()[ 0 ]); 
    } 
    
    / * * 
     *この方法は、実行された後、製織部分の方法に戻る前に、afterMethodのエントリポイントが以前に宣言()
     * @paramジョインポイント
     * / 
    @After(" afterMethod()"パブリック ボイドafterAspect(){ 
        システム。OUT .println(メソッドが実行); 
    } 
    
    / * * 
     *メソッド戻り、切断するために織り、本発明の方法に直接配置されたエントリポイント
     * @paramジョインポイント
     * / 
    (値を@AfterReturning = " 実行(springAopAnnotion.Sleep *(..))。" 公共 ボイドafterReturnAspect(){ 
        システム。OUT .println(" メソッドが戻る" ); 
    } 
    
     / * * 
     *異常通知:ターゲットメソッド異常は、次のコードを発生したときに本発明の方法において直接配置されたエントリポイントは、実行されます
     * / 
    @AfterThrowing(値 = "実行(* springAopAnnotion.Sleep *(..))"投げ= " E " 公共 ボイドafterThorwingMethod(ジョインポイントJP、NullPointerExceptionがE){ 
        文字列methodNameの = jp.getSignature()のgetName();. 
        。システムOUT .println ([異常通知]方法[  + methodNameの+ ]が例外を発生します + E); 
    } 
    
      / * * 
      *アドバイスの周り:ターゲットメソッドが別々に実行される前と後の異常は、いくつかの他のコードを実行発生した場合、いくつかのコードを実行し、カット本発明の方法において直接配置点
      * @return 
      * /
     @Around(値 = " 実行(* springAopAnnotion.Sleep。*(..))" 公共 無効aroundMethod(ProceedingJoinPointのJP){
          しようと{ 
             システム。アウト .println(" aroundMethod前置切面" ); 
             jp.proceed(); 
             システム。アウト .println(" aroundMethod后置切面" ); 
         } キャッチ(ThrowableをE){ 
             e.printStackTrace(); 
         } 
     } 
}

 

5、テストクラス

パッケージspringAopAnnotion; 

輸入org.springframework.context.ApplicationContext; 
輸入org.springframework.context.support.ClassPathXmlApplicationContext; 

パブリック クラスTestSleep {
     公共 静的 ボイドメイン(文字列[]引数){ 
        ApplicationContextのAC = 新しい ClassPathXmlApplicationContext(" springConfig /スプリングAOP-annotion.xml " )。
        スリープスリープ =(スリープ)ac.getBean(" 睡眠" ); 
        sleep.sleep(" リトルボール" ); 
    } 
}

 

結果:

フロントセクションをaroundMethod 
メソッドが実行される前に、参照 = リトルボール
リトルボールがスリープ状態にしたい
リアセクションをaroundMethod 
メソッド実行後に
メソッドが後に返します

 

おすすめ

転載: www.cnblogs.com/gllegolas/p/11771627.html