AOP誰もが非常に明確だと思います。リクエストログを処理したり、いくつかの方法を監視したり、例外がある場合は何を処理する必要がある場合がありますか?次に、Spring-BootからAOPを紹介します。
[開発環境:JDKバージョン番号は1.8、春です
ブートのバージョン番号は1.4.1] {style =” background-color:#ff0000”}
まず、JARパッケージを最初に紹介します。
POMファイルは次のように追加されます。
<! - aop-> <dependency> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-aop </artifactid> </dependency> <! - 印刷用 - > <依存関係> <依存関係> <groupid> com.google.god.gson </groupid </groupid> </groupid> </groupid> <バージョン> 2.7 </version> </dependency>
JARパッケージを導入した後、起動を起動するために2つの簡単な要求処理方法を追加します。
@SpringBootApplication(scanbasePackages = {"com"})@restcontrollerpublic class demoapplication {public static void main(string [] args){springApplication.run(demoApplication.class、args); } //引数なしでget requestをテスト@requestmapping(value = "/testaspect"、method = requestmethod.get)public uservo test(){uservo uservo = new uservo(); uservo.setage( "23"); uservo.setName( "He Xiaowu"); uservo.setsex( "MALE"); Uservoを返します。 } // get requestをパラメーターでテストし、パラメーターコンテンツ@requestmapping(value = "/testaspectargs"、method = requestmethod.get)パラメーターコンテンツを印刷させます。 uservo.setname(name); uservo.setage(age); uservo.setsex(sex); Uservoを返します。 }2つの簡単な要求処理方法を追加した後、AOPを追加しましょう
/** *プロジェクト名:Springbootdemo *作成者:He Xiaowu *作成時間:16/12/4 7:05 PM *クラス名:AspectDemo *クラス説明: * ///宣言は@Aspect //宣言はSpring Managed bean@component@component@order(1)public class aspectdemo {private logger = getlogger(get logger(); private gson gson = new gson(); //実行式のポイントを宣言@pointCut( "execution(public * com.example.demoApplication。 *(..))")private void controlleraspect(){} //メソッドを要求する前にコンテンツを印刷する前に(value = "controlleraspect()")public void methodbefore (ServletRequestattributes)requestContextholder.getRequestattributes(); httpservletrequest request = requestattributes.getRequest(); //リクエストコンテンツを印刷しますlog.info( "============================================================================ ================================================================================ ================================================================================ ============================================================================== ================================================================================ ============================================================================== ================================================================================ ============================================================================== //メソッドが実行された後に返品コンテンツを印刷@AfterTurning(returning = "o"、pointcut = "controlleraspect()")public void methodafterturning(object o){ log.info("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------2つが構成されたら、リクエストしてから印刷ログを表示します。まず、コンテナを起動し、最初にパラメーター化処理方法を要求します。印刷ログは次のとおりです。
{width =” 1232”
高さ=” 132”}
要求されたURL、メソッド、ARGSパラメーター値、タイプ、および返されたコンテンツがすべて印刷されていることがわかり、これがAOPインターセプトであることを示しています。
次に、パラメーターなしでリクエスト処理方法をテストし、次のようにログを印刷します。
{width =” 1100”
height =” 130”}
この方法で印刷されたメソッドパラメーターは、パラメーターの渡しを必要としないため、空の配列であることがわかります。
上記は、Web処理のログ処理のためのスプリングブート参照AOPです。 AOPセクションのいくつかの主要な注釈を以下に示します。以下は、注釈の単なる説明と使用法です。著者はそれらを詳細にテストしません。興味がある場合は、自分でテストできます。
クラス注釈:
@Aspectは、クラスをアスペクトクラスとして定義します
@Order(i)は、ファセットクラスの処理優先度を示します。 I値が小さいほど、優先度レベルが高くなります。 PS:クラスに注釈を付けるか、メソッドを注釈することができます。
メソッド注釈:
@pointcutメソッドをポイントカットとして式として定義します。
@BeFore Foreは接線の前にメソッドを実行します、コンテンツは指定された接線ポイントです
@afterはポイントカット後、戻る前に実行します、
@AfterTurningは、エントリポイントと戻りの後に実行されます。いくつかの方法の返品パラメーターを処理する場合は、ここで操作できます。
@Aroundは接線を囲んで、接線ポイントに入る前に実行する前に、そして接線のポイントの後に実行します
@AfterThrowingは、スリットポイントの後に処理のために例外をスローします
@Order(i)は、ポイントカットの優先度を示しています。 Iが小さくなるほど、優先度が高くなります
@pointcutアノテーションの組み合わせ:
上記のコードでは、指定されたパスのみを処理する接線点を定義します。
@pointcut( "execution(public * com.example.demoApplication。 *(..))")private void controlleraspect(){}今、私たちは他のパスを処理するためのポイントを定義しています。
@pointcut( "execution(public*com.demo。*。*(..)")private void controlldemo(){} {}上記の接線点はすべて別々に処理されます。それらの両方を処理するために接線ポイントが必要な場合は、次のように構成できます。
@pointcut(value = "controlleraspect()|| controllerdemo()")private void all(){} @pointcutアノテーションでは、@pointcutで注釈された他のメソッド名を直接参照して、ポイントカットが2つのパスの下でメソッドを処理できるようにします。
@pointcut annotation実行式:public*com.demo。*。*(..)
メソッドを表す最初のパブリック修飾子は、最初の *の代わりに *を使用して返品値を表すことができ、 *はすべてを表します
com.demo。*パッケージパス、。*パス内の3番目のパッケージを表します。*パスの下のすべてのパッケージの下のすべてのクラスのメソッドを表します。
(..)無制限のメソッドパラメーターを意味します
@order(i)注釈に関するいくつかのメモ:
注釈クラス、値が小さく、優先度が高く、注釈法が高く、2つの注釈が注釈が付けられます。
2つを要約すると、次のとおりです。
エントリポイントの前の操作では、エントリポイントの後の操作は注文値によって小さいから大部分まで実行され、エントリポイント後の操作は注文値から大部分から小まで実行されます
伸ばす:
一部の読者は、着信と終了からのリクエストに必要な時間を印刷し、メンバー変数を定義して時間をカウントし、@BeForeと@AfterTurningアクセスを与える場合、同期の問題がある場合があります。したがって、一般的なタイプを指定するthreadlocalオブジェクトを参照します。 @BeForedでリクエストを記録し、@AfterTurningでレコードを差し引く時間は時間がかかります。コードは次のとおりです。
/** *プロジェクト名:Springbootdemo *作成者:He Xiaowu *作成時間:16/12/4 7:05 PM *クラス名:AspectDemo *クラス説明: * ///宣言はセクションです//宣言はスプリングマネージドBean@component@component@order(1)public class aspectdemo {private logger logger.getlogger(GetLogger(); private gson gson = new gson(); threadlocal <long> starttime = new threadlocal <long>(); //実行式のポイント@pointcut( "execution(public * com.example.demoApplication。 *(..))")private void controlleraspect(){} //メソッド@be fore = "controlleraspect()")public void methodbefore(joinpoint joinpoint(){startime.currimmillis(); servletRequestattributes requestAttributes =(servletRequestattributes)requestContextholder.getRequestattributes(); httpservletrequest request = requestattributes.getRequest(); //リクエストコンテンツを印刷しますlog.info( "======================================================================================== ===================================================================== ========================================================================== ===================================================================== ========================================================================== ========================================================================== ========================================================================== arrays.toString(joinpoint.getargs())); log.info( "====================================================================================================== arrays.toString(joinpoint.getargs())); log.info( "応答コンテンツ:" + gson.tojson(o)); log.info("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------上記はすべて、私のテストで得られた結果です。違いやエラーがある場合があります。私を修正してください。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。