..


スポンサーリンク

AOP - アスペクトの作成

の側面を作成する方法を見てみましょう
まず最初に、例が我々のポイントカットを作成するインターフェイスを作成します






パブリックインターフェイスMyInterface {





  



公共ボイドF1();





  



公共int型F2();





  



公共のint f3は()例外をスローします。





  



公共ボイドF4は、()例外をスローします。





  



公共int型F5();







 }



ポイントカットを書き込むには、知っている必要がありますAspectJのポイントカット指定子を 、私たちの例で我々は、ジョインポイントの実行メソッドを一致する場合のみ実行を使用します。
実行の形式は、型の式です。
 



実行(修飾子 - パターン?RET型パターン型パターンを宣言?名前パターン(パラメータ-パターン)スローパターン?)

 
ここで:
  • 修飾子-パターン:オプションの修飾子を適用することで、各パラメータは、メソッドのタイプを示します。 値*は、修飾子のすべてのタイプに一致します。
  • RET -タイプパターン:それは、メソッドの戻り値の型を示します。 値*は、戻り値のすべてのタイプに一致します。
  • 宣言型のパターン:オプションのパラメータ、メソッドを宣言するクラスを示します。 *値は完全にクラス名またはその一部を置き換えるためにワイルドカードとして使用されます。
  • 名前パターン:メソッドの名前。 *値は、完全にそれの方法または一部の名前を置き換えるためにワイルドカードとして使用されます。
  • パラメータ-パターン:メソッドのパラメータを示します。 値(..)がゼロ以上のパラメータを受け入れる方法を示し、値は()、パラメータをとらないメソッドを示します。 *値は、メソッドの型パラメータを置き換えるためにワイルドカードとして使用される、例えば、(*、java.lang.String)を任意のタイプの最初の入力として2つのパラメータを取るメソッド、第二のタイプと一致し文字列。
  • スローパターン:オプションのパラメータは、メソッドによってスローされた例外のタイプを示す、例えば、java.lang.Exceptionがスロー
より良い構文を理解するために、我々は、例から始める。

まず、私たち自身の面を作成する必要があります。






 @アスペクト







 {publicクラスMyAspect



  



 .............







 }



我々が見るようにクラスに@アスペクトとアノテーションが付記されています。 あなたがAOP nell'applicationContext XMLのサポートを有効にする必要があるので、これだけでは十分ではありません。





 < - !AspectJをENBLING - >







 <aop:aspectj-autoproxy />









 < - !MYASPECT - >







 <bean id="myAspect" class="it.mrwebmaster.aop.MyAspect" />



一度メソッドF1(アドバイス前)の実行前に実行されるアクションは、例えば、これらの2つの操作がアドバイスを作成する準備が行われている






 @の前に("実行(* it.mrwebmaster.aop.MyInterface.f1 (..))")







公共ボイドbeforeF1(){



  



 system.out.printlnを("F1 BEFORE");







 }



コー​​ドからわかるように、我々は、ポイントカットを識別する値として式を受け付ける注釈の前に@を使用していました。 この例では、式はその修飾子、戻り値の型と入力パラメータでインタフェースi​​t.mrwebmaster.aop.MyInterface F1 indipendetementeと呼ばれているすべてのメソッドに一致します。
同様に我々は、正しくアノテーション@はAfterReturningを使用して(アドバイスを返した後)メソッドがその実行を完了したときに実行するアドバイスを使用することができます。






 @(ポイントカットをAfterReturning ="実行(* it.mrwebmaster.aop.MyInterface.f2 (..))",返す="RETVAL")







公共ボイドafterReturningF2(オブジェクトRETVAL){



  



 system.out.printlnを("RETURN F2"+ RETVAL);







 }



このレコードは、ポイントカットに加えて、オブジェクトに与えられた名前は、アドヴァイタの入力パラメータとして与えることができるメソッドによって返される、次のパラメータを取ります。 この場合、ポイントカットの表現は、メソッド、この場合は、F2の名前を除いてinviarataです。
非常によく似たメソッドがアノテーションの@がAfterThrowingを使用して例外を(アドバイスを投げた後に)スローしたときに実行されるアドバイスは、次のとおりです。





 @(ポイントカットをAfterThrowing ="実行(* it.mrwebmaster.aop.MyInterface.f3 (..))",投げる="スロー可能オブジェクト")







公共ボイドafterThrowingF3(スロー可能オブジェクトのThrowable){

 

  



 system.out.printlnを(+スロー可能オブジェクトを"F3はスロー");







 }



違いは、メソッドはオブジェクトが例外を返さないことです。

アドバイスのもう一つのタイプは常にメソッドの後に実行され、それは時間は通常、または例外を(アドバイス後)をスローします このアドバイスは、後に@を使用して実装されています:






 @の後("実行(* it.mrwebmaster.aop.MyInterface.f4 (..))")







公共ボイドafterF4(){



  



 system.out.printlnを("AFTER F4");







 }



最後に我々はaroundアドバイス"を行う方法参照してください






 @アラウンド("実行(* it.mrwebmaster.aop.MyInterface.f5 (..))")







公共ボイドaroundF5(ProceedingJoinPoint PJP){



  



 system.out.printlnを("F5 BEFORE");



  



してみてください{



    



オブジェクトRETVAL =)(pjp.proceed;



    



 system.out.printlnを("RETURN F5キー"+ RETVAL);



  



する} catch(Throwableの電子){



    



 system.out.printlnを("F5はスロー"+電子);



  



 }







 }



我々はポイントカット式のコードからわかるように、他のアドバイスとは異なるものです。 どのような変更を明示的にクラスProceedingJoinPoint進むか、そのアプリケーションの入力として渡される一つのメソッドを介してメソッドの実行を呼び出す必要があります同じアドバイスです。 このインタフェースは、メソッドのパラメータ、戻り値の型とメソッドが実行されているオブジェクトに関する情報を取得するために進んで他のメソッドを使用しても用意されています。 それはどんな深い読者に委ねられている。

私たちにできること私たちのアドバイスをテストするには、インターフェイスMyInterfaceの単純な実装を書き込み、および主要なテストを作成することです。






 MyInterfaceImpl {publicクラスがMyInterfaceを実装





  



 @オーバーライド



  



公共ボイドF1(){



    



 system.out.printlnを("F1");



  



 }





  



 @オーバーライド



  



公共int型F2(){



    



 system.out.printlnを("F2");



    



 0を返します。



  



 }





  



 @オーバーライド



  



公共のint f3は(){例外がスローされます



    



 system.out.printlnを("F3");



    



新しい例外を("例外F3")をスローします。



  



 }





  



 @オーバーライド



  



公共ボイドF4キー(){例外をスローします。



    



 system.out.printlnを("F4");



  



 }





  



 @オーバーライド



  



公共int型F5(){



    



 system.out.printlnを("F5");



    



 0を返します。



  



 }







 }



。nell'applicationContext XML:





 <! - ターゲット:オブジェクト - >







 <bean id="myInterfaceImpl" class="it.mrwebmaster.aop.MyInterfaceImpl" />



主な試験:





パブリッククラスメイン{





  



公共の静的な無効メイン(文字列[] args){





    



 / **



     



 * Instanz IoCコンテナ



     



 * /



    



 ApplicationContextのApplicationContextのClassPathXmlApplicationContext =新しい("applicationContext.xmlを");





    



 MyInterface MyInterface =(MyInterface)applicationContext.getBean("myInterfaceImpl");





    



 myInterface.f1();



    



 system.out.printlnを("########## \ nを");





    



 myInterface.f2();



    



 system.out.printlnを("########## \ nを");





    



してみてください{



      



 myInterface.f3();



    



します} catch(Exception e)の{}



    



 system.out.printlnを("########## \ nを");





    



してみてください{



      



 myInterface.f4();



    



します} catch(Exception e)の{}



    



 system.out.printlnを("########## \ nを");





    



 myInterface.f5();



    



 system.out.printlnを("########## \ nを");



  



 }







 }



スプリングJavaのガイド
E -ラーニング
Linuxの(コース) Linuxの(コース)
オープンソースシステムへの完全なガイド。 49€から。
PHP(コース) PHP(コース)
動的なWebサイトを作成するためのフルコース。 49€から。
RubyとRuby on Rails(コース) RubyとRuby on Rails(コース)
RubyとRoRのと、ソフトウェアやWebアプリケーションを作成します。 39€から。
スポンサーリンク