AspectJのは、Java言語を拡張するJavaベースのAOPフレームワークです。春2.0 AspectJの道のために後で追加のサポートは、春のフレームワークの新バージョンでは、AspectJのAOPを開発する方法をお勧めします。
:AspectJのAOPを使用すると、通常は2通りの方法で開発し
た宣言XMLに基づきます。
注釈ベースの宣言型。
XMLベースの宣言型の XMLベースの宣言型Spring構成ファイル定義部、開始点と宣言通知、およびすべての態様及び顧問がで定義されなければならない方法を指す <AOP:設定> 要素。 ここでは春の事例発表を通じてAOP XMLベースの宣言型を達成するための開発を使用する方法について説明します。 1 。インポートJARパッケージ 次のようにスプリングAOPのAspectJのJARパッケージは、AspectJのジャーパッケージの導入に関連するものを超えて必要な導入に加えて使用します。 春 -aspects-3.2.13 .RELEASE.jar:春はAspectJの春パッケージで提供されています提供するために実装。 com.springsource.org.aspectj.weaver -1.6.8.RELEASE.jar:AspectJの仕様を提供され、公式サイトでは、HTTPSことができます:// repo.spring.io/webapp/#/search/quick/とダウンロードを検索します。 2 。クラスMyAspectカット作成 、編集後の下に示すように、パケットにクラスMyAspectカットを作成し、SRCディレクトリにcom.mengma.aspectj.xmlというパッケージを作成するために。 パッケージcom.mengma.aspectj.xml; インポートorg.aspectj.lang.JoinPoint。 インポートorg.aspectj.lang.ProceedingJoinPoint; // 態様クラス パブリック クラスMyAspect { // 事前通知 公共 ボイドmyBefore(ジョインポイントジョインポイント){ System.out.printの(「事前通知、ターゲット:」); のSystem.out。印刷(joinPoint.getTarget() + "メソッド名:" ); System.out.printlnは(。joinPoint.getSignature()のgetName()); } // ポスト通知 公共 のボイドmyAfterReturning(ジョインポイントジョインポイント){ のSystem.out。印刷( "通知後のメソッド名:" + 。joinPoint.getSignature()のgetName()); } // アドバイス周り パブリックオブジェクトmyAround(ProceedingJoinPoint ProceedingJoinPoint) スローのThrowable { するSystem.out.println( "サラウンドスタート"); // 開始 オブジェクトOBJ = proceedingJoinPoint.proceed(); // 現在のターゲットメソッドの実装 のSystem.out.println( "サラウンド終了" ); // 端 戻りOBJ; } // 異常通知 公共 ボイドmyAfterThrowing(ジョインポイントジョインポイント、のThrowable E){ するSystem.out.println( "異常通知" + "間違った" + e.getMessage()); } // 最終通知 公共 のボイド myAfter(){ のSystem.out.println(「最終通知」); } } 上記のコードは、それぞれ、これらの方法では、対象物がジョインポイントパラメータクラス名、メソッド名および宛先方法特定のパラメータによって得ることができる、通知方法の異なるタイプを定義します。通知を受信するProceedingJoinPointタイプパラメータ囲む必要があり、そのノートは、戻り値はObject型でなければなりませんし、例外をスローする必要があります。スロー可能異常通知は、異常情報を出力するため、パラメータの型を渡すことができます。 3 。Spring構成ファイルの作成 以下のように、プロファイルapplicationContext.xmlをするcom.mengma.aspectj.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 " のxsi:schemaLocationの =" HTTP:// www.springframework。// www.springframework.org/schema/beans/spring-beans-2.5.xsd HTTP:// www.springframework.org/schema/aop HTTP:// www.springframework.org/schema/aop/spring-aop- 2.5.xsd "> <! -ターゲットクラス- > <豆ID =" customerDao " クラス =" com.mengma.dao.CustomerDaoImpl "/> <! -アスペクトクラス- > <豆ID =" myAspect " クラス = "com.mengma.aspectj.xml.MyAspect"> </豆> < - AOPプログラミング- >! <AOP:config>の <AOP:アスペクトREF = "myAspect"> <! -構成エントリ・ポイント、これは、最終的な通知を強化する方法- > <AOP:ポイントカット表現= "実行(* com.mengma.dao。*。*(..))" のid= "myPointCut" /> < -事前通知、エントリポイントとアドバイスポイントカットに関連付けられた通知- >! <AOP:メソッドの前に= "myBefore" pointeut-REF = "myPointCut" /> < -アドバイス後,!メソッドの復帰を実行した後、戻り値は属性を返すに得ることができる- > <AOP:=「myAfterReturning」-法帰国後の ポイントカット =「returnVal」/>を返す-REF =「myPointCut」 < - > -サラウンド通知を! <AOP:メソッドの周り=ポイントカット-REF = "myPointCutを" "myAround" /> < -例外通知:!例外ハンドラが発生したため、異常電流方法が生成受け取ることができます- > < - *注!:プログラムが例外ではない場合、それは実行されません強化- > < - *投げ属性:! 2番目のパラメータセットの通知の名前、種類のThrowable - > <AOP:アフター投げ方式=「myAfterThrowing」 ポイントカットを= "myPointCut" -ref投げ= "E" /> < -最終通知:どのような問題が発生したが、関係なく、プログラムの起こる、実行されます- > <AOP:方法、後= "myAfter"ポイントカット-REF = "myPointCutは" /> </ AOP:アスペクト> </ AOP:設定> </豆> 上記のコードでは、最初のコードの4,7,8行が名前空間AOPに導入しました。12日の行は、クラスのセクションを指定します。 最初の方法は通知増強を必要とする17,18起動構成されている点ライン、式=「実行(* com.mengma.dao 。*。*(..)) 手段その全て補強パッケージcom.mengma.dao方法 通知(情報)と開始点(ポイントカット)コードプレフィックスに関連付けられたコードの20〜32行のは、ライン20を例に通知する、<AOP:前>メソッドプロパティを指定通知タグ、pointcut- REFプロパティは、プロセスを強化するために、ある開始点を指定し、通知は、いくつかの他の参照コードのコメントを配置してもよい。 4 テスト・クラスを作成し 、以下のように、com.mengma.aspectj.xmlパッケージでテストクラスた[XMLTestを作成する。 パッケージcom.mengma。 aspectj.xml; インポートorg.junit.Test; 輸入org.springframework.context.ApplicationContext; 輸入org.springframework.context.support.ClassPathXmlApplicationContext; 輸入com.mengma.dao.CustomerDao; パブリック クラスた[XMLTest { @Test 公共 ボイド試験(){ 文字列xmlPath = "COM / mengma / AspectJの/ XML / applicationContext.xmlを" 。 ApplicationContextのApplicationContextの = 新しいClassPathXmlApplicationContext( xmlPath)。 // 从春容器获取实例 CustomerDao customerDao = (CustomerDao)のApplicationContext .getBean( "customerDao"); // 実行方法 customerDao.add(); } } 5 。プロジェクトを実行し、結果を表示 試運転()メソッドの後にJUnitテストを使用して、正常に実行され、コンソール出力
注釈ベースの宣言型の
XML設定ファイルの使用にもかかわらず、春には、AOPを実現するために開発することができますが、すべての設定は、設定ファイルに集中している場合は、必然的にXML設定ファイルにつながるあまりにも肥大化されるため、いくつかのメンテナンスやアップグレードを持参します困難。
アノテーションベースの宣言型-このためには、AspectJのフレームワークは、AOP開発の開発のための別の方法を提供します。AspectJのは、開始点、注釈付きセクションを使用可能にし、強調処理、及びフレームを特定することができるとSpring AOP剤、これらの注釈を生成する方法。
注釈の注釈
@Aspectは、セクションを定義するために使用されます。
それは事前通知を定義するために使用される@BeforeはBeforeAdviceに相当します。
通知後の対応にAfterReturningAdviceを定義するため@AfterReturning。
@Around MethodInterceptorのに対応し、助言を中心に定義します。
@AfterThrowingは、ThrowAdviceと同等のものを投げ通知を定義するために使用されます。
かどうかにかかわらず、例外の、最終的な最終的な通知を定義するために使用@After、通知が実行されます。
通知を導入規定する@DeclareParents、IntroductionInterceptorは(マスターに必須ではない)と等価です。
1 。クラスMyAspectカットを作成し 、以下に示すように、パケットのクラスMyAspectカットを作成し、SRCディレクトリにcom.mengma.aspectj.annotationというパッケージを作成します。 パッケージcom.mengma.aspectj.annotation; インポート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; // アスペクトクラス @Aspect @Component パブリック クラスMyAspect { // 置換の<AOP:ポイントカット // 式=「実行(com.mengma.dao .. * * *(.. 。)) "ID =" myPointCut "/> // 要件:この方法は、専用にする必要があり、値なし、カスタムの名前、パラメータなし @Pointcut("実行(* com.mengma.dao .. * *(...) ) " ) プライベート ボイドmyPointCut(){ } // 事前通知 @Before(" myPointCut() " ) 公共 ボイドmyBefore(ジョインポイントジョインポイント){ System.out.printの( "事前通知、ターゲット: " )。 System.out.print(joinPoint.getTarget() + "方法名称:" ); System.out.println(joinPoint.getSignature()のgetName()。)。 } // 后置通知 @AfterReturning(値= "myPointCut()" ) 公共 ボイドmyAfterReturning(ジョインポイントジョインポイント){ System.out.print( "后置通知、方法名称:" + 。joinPoint.getSignature()のgetName() ); } // 环绕通知 @Around( "myPointCut()" ) パブリックオブジェクトmyAround(ProceedingJoinPoint proceedingJoinPoint)は スローのThrowable { するSystem.out.printlnを( "环绕开始")。 = ProceedingJoinPoint.proceed OBJオブジェクト(); // 現在のターゲットメソッドの実装 のSystem.out.println( "サラウンドエンド"); // エンド 戻りOBJ; } // 異常通知 @AfterThrowing(値= "myPointCut() "、投げ= "E" ) 公共 ボイドmyAfterThrowing(ジョインポイントジョインポイント、のThrowable E){ するSystem.out.println( "異常通知" + "間違った" + e.getMessage()); } // 最終通知 @After(「myPointCut( ) " ) 公共 ボイドmyAfter(){ System.out.printlnは( "最終通知」)。 } } 上記のコード、第一このセクションの13行@Aspect注釈はこれを反映するために@Componentコメントを追加するために、成分として使用されるクラスです。図19に示すように、設定するための注釈エントリーポイント@Poincutラインは、コードエントリポイントXMLファイルで構成された置換されています。 各コメント文を追加するための適切な方法で通知し、(このような異常異常パラメータの通知など)の追加パラメータの引数として実行するメソッドに渡されたエントリポイントメソッド名「myPointCut」は、コードヒントに応じて渡すことができ対応するプロパティの値。 2 。注釈ターゲットクラス 注釈@Repository(com.mengma.dao.CustomerDaoImplターゲットクラスの「customerDao」)。 3 。Spring構成ファイルの作成 以下のように、com.mengma.aspectj.annotation applicationContext.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 "= "http://www.springframework.org/schema/context" のxsi:schemaLocationの =「http://www.springframework.org/schema/beans HTTP:// www.springframework.org/schema/beans/spring- 2.5.xsd-豆 HTTP:// www.springframework.org/schema/aop HTTP:// www.springframework.org/schema/aop/spring-aop-2.5.xsd HTTP:// www.springframework.org/schema /コンテキスト HTTP:// www.springframework.org/schema/context/spring-context.xsd「> < - com.mengmaでパッケージを含むすべての注釈をスキャン- >! <コンテキスト:スキャンベース-コンポーネントパッケージ = "com.mengma" /> < ! - > -カットは、自動プロキシを開きます <AOP:AspectJの-自動プロキシ> </ AOP:AspectJの-自動プロキシ> </豆> コード上、最初AOPネームスペースの制約を導入し、アノテーションアスペクトクラス@AspectJ通常の作業を支援する、第二のライン13コードは、スキャンパッケージを追加し、注釈を有効にします。なお、ここで、さらなる注釈com.mengma.dao.CustomerDaoImplターゲットクラスを含むので、塩基パッケージ値com.mengma 15は、作用線が自動的にオンエージェントを切断します。 4 テストクラスを作成し 、以下のように、com.mengma.aspectj.annotationパッケージでテストクラスという名前AnnotationTestを作成します。 パッケージcom.mengma.aspectj.annotation; インポートorg.junit.Test; インポートorg.springframework.context.ApplicationContext; インポートorg.springframework.context.support.ClassPathXmlApplicationContext; インポートcom.mengma.dao.CustomerDao; パブリック クラス{AnnotationTest @Test 公共 ボイド試験(){ 文字列XMLPath = "COM / mengma / AspectJの/ XML / applicationContext.xmlを" ; のApplicationContextのApplicationContext = 新しい新しいClassPathXmlApplicationContext( XMLPath); // スプリング容器からインスタンスを取得 CustomerDao customerDao = (CustomerDao)のApplicationContext .getBean(「customerDao」); // 実行方法 customerDao.add(); } } 5 プロジェクトを実行し、結果を表示する。 正常に実行JUnitテストテストの実行後に()メソッドは、コンソール出力を使用して