1。はじめに
開発プロセス中に、多くの例を書く必要があることがよくあります。
@getMapping( "/id/get")public result getbyid(string id)throws Exception {log.info( "要求パラメーターIS:"+id); Verify(new verifyparam( "Department ID"、id)); result result = new result( "ID!"を介して正常に取得! "、service.querybyid(id)); log.info( "return message is:"+result.toString());返品結果; }リクエストパラメーターと戻りパラメーターを印刷すると、これらの操作は各メソッドに存在し、コードをより冗長にします。このため、ダイナミックプロキシを使用して印刷パラメーターを使用し、セクションとしてリターンメッセージを印刷し、ポイントカット式を使用して各メソッドにカットできます。
2。ステップ
1. AOP関連の依存関係を紹介します。
<! - aop関連の依存関係 - > <依存関係> groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-aop </artifactid> </dependency>
依存関係を導入した後、Spring-AOPは必要な依存関係をロードします。 SpringはaspectJをデフォルトで使用して通知を実装します。
その中で、aspectjweaver.jarには、aspectjポイントカット式を分析するファイルが含まれています。この依存関係は、トランザクションを処理するためにポイントカット式を使用する場合にも必要です。
2。構成:
1)構成クラスを作成します。
/*** @function説明:コントローラーレイヤー操作に使用されるAOPクラス* @author管理者*/ @component //管理 @aspectのスプリングを処理する//このクラスをアスペクトクラスControllAop {}として表します@Aspect Annotationは、ポイントカット式を定義できるアスペクト管理クラスであり、AspectJフレームワークが解析されることを表しています。
2)ポイントカット式を定義します。
@pointcut( "execution(public*com.hzt.manage。
ここで、@pointCutはこの方法をポイントカット式として表します。その値はポイントカット式であり、値を省略でき、そのラフな形式は次のとおりです。
@Annotation(式タグ +式形式)
形式の場合、Spring AOPでサポートされているAspectJポイントカットインジケーターは次のとおりです。
1。実行:メソッド実行と一致するために使用される接続ポイント。
2。内:指定されたタイプ内のメソッドの実行を一致させるために使用されます。
3。これ:現在のAOPプロキシオブジェクトタイプと一致するために使用される実行方法。 AOPプロキシオブジェクトのタイプマッチングは、インターフェイスの導入とタイプマッチングが含まれる場合があることに注意してください。
4。ターゲット:現在のターゲットオブジェクトタイプと一致するために使用される実行方法。ターゲットオブジェクトのタイプマッチングはタイプマッチングであるため、インターフェイスの導入が含まれていないことに注意してください。
5. args:実行方法は、現在実行されているメソッドによって渡されたパラメーターを指定されたタイプとして一致させるために使用されます。
6。@Within:指定された注釈型内でメソッドを保持するために使用されます。
7。@target:ターゲットオブジェクトが指定された注釈を保持する現在のターゲットオブジェクトタイプと一致するために使用される実行方法。
8。@Args:指定された注釈を保持している現在実行されている方法で渡されたパラメーターの実行に一致するために使用されます。
9。@Annotation:現在、メソッドを実行しているメソッドと一致するために使用されます。指定された注釈が保持されます。
10。Bean:Spring AOP拡張機能、AspectJには、Beanオブジェクトを特定の名前と一致させるための実行方法がありません。
11。参照ポイントカット:他のネーミングエントリポイントを指すことを意味します。@ApectJスタイルのみがサポートしていますが、スキーマスタイルはサポートしていません。
ARGSは、ポイントカット式メソッドを実行するときにパラメーターを定義します。
@pointcut(value = "execution(public*com.hzt.manage。*。web.controller..*。*(..))&& args(param)"、argnames = "param")// pointcut express public void pridilege1(string param){}実行方法の接続ポイントの表現に焦点を当てており、その粗い構造は次のとおりです。
実行(Modifiers-Pattern?RetType-Pattern宣言-Type-Pattern?name-pattern(param-pattern)throws-pattern?)
1。モディファイアマッチング(Modifier-Pattern?)(省略できます)
2。return値マッチング(ret-type-pattern)は、(文字列)などの任意の返品値を表すことができます。
3。宣言タイプパターン?たとえば、 *.Manageは、第1レベルのパッケージを任意のものとして表し、第2レベルのパッケージを管理の名前として表します。 *..管理は、すべての管理パッケージの下のサブクラスパッケージを表します。 com .. *。コントローラーは、comパッケージなどのすべてのコントローラーパッケージを表し、 *すべてのパッケージが一致することを意味します。 (省略していません)
4。メソッド名マッチング(名前-Pattern)メソッド名を指定できます。または *すべてを表します。GET *はGETから始まるすべてのメソッドを表します。
5。パラメーターマッチング(((param-pattern))特定のパラメータータイプを指定でき、複数のパラメーターが「」で分離されます。各パラメーターは、(文字列)が文字列パラメーターを一致させる方法を意味する、任意のタイプのパラメーターに一致するように「*」にすることもできます。 (*、文字列)は、2つのパラメーターを一致させる方法を意味します。最初のパラメーターは任意のタイプであり、2番目のパラメーターは文字列タイプです。 (..)は、任意のパラメーターを表すために使用できます(省略されていません)
6。例外タイプマッチング(スローパターン?)
3。ファセットメソッドを定義します
@Around( "Privilege()")パブリックオブジェクトの周り(ProceedjoinPoint PJD)スロースロー可能{//メソッド名String className = pjd.getSignature()。getClass()。getName(); //実行方法を取得しますname string methodname = pjd.getSignature()。getName(); / **初期化ログ印刷*/ logger log = loggerFactory.getLogger(className); // returnパラメーターオブジェクトresult = nullを定義します。 //開始時間を記録しますlong start = system.currenttimemillis(); //メソッドパラメーターを取得オブジェクト[] args = pjd.getargs();文字列params = "フロントエンド要求パラメーターは次のとおりです。 //リクエストパラメーターコレクションとトラバースとスプライスを取得します(オブジェクトオブジェクト:args){params + = object.toString() + "、"; } params = params.substring(0、params.length()-1); //リクエストパラメーターパラメーターlog.info(classname + "class" + methodname + "" + params)を印刷します。 //ターゲットメソッドresult = pjd.proceed()を実行します。 //返されたメッセージlog.infoを印刷( "メソッドはメッセージを" +(result instanceof?(result)result:result))として返します。 //実行時間log.info(methodname + "メソッド実行時間は" +(system.currenttimemillis() - start));返品結果; }5。@aroundサラウンド通知上記のコードに示すように、それはサラウンド通知であり、進行中のジョンポイントパラメーターがあります
pjd.proceed();メソッドは、ターゲットメソッドの実行を表し、オブジェクトタイプの戻り値を取得します。装飾処理など、返品値を処理できます。
返品の値は、メソッド実行の結果です。上記のコードでは、最初にクラス名、メソッド名、メソッド要求パラメーターなどを取得し、スプライシングを印刷し、メソッド実行の開始時間を記録し、ログに印刷します。
次に、メソッドを実行し、メソッドリターン結果を取得し、実行時間と実行結果を印刷します。
最後に、実行結果が返されます。つまり、リクエストメッセージのAOPセクションエンコードと返信メッセージが完了します。
@Aroundがそれを周囲の通知方法として表している場合、次のタイプがあります。
1。 @before notificationは、一般的にメソッド名とパラメーター値を含む現在の接続ポイントの接続の詳細を接続するために使用される要求パラメーターJoinPointを備えています。メソッド本体は、メソッドが実行される前に実行され、メソッドパラメーターを変更できず、メソッド実行結果も変更できません。
@before(value = "privilege()")public void before(joinpoint joinpoint){}2。@After Post通知:ターゲットメソッドが実行された後に例外が発生するかどうかに関係なく、実行が実行されるという通知。 notification後の状態では、ターゲットメソッドの実行結果にアクセスすることはできません(例外が発生する可能性があるため)、メソッドの実行結果を変更することはできません。
@before(value = "privilege()")public void after(joinpoint joinpoint){}3。@AfterTurningは通知を返します。ターゲットメソッドが実行されたときにのみ実行される通知は、ポストアランジングメソッドと同じです。メソッド実行結果(通常の実行のため)とメソッドの接続の詳細にアクセスできますが、メソッド実行結果を変更することはできません。
@AfterTurning(value = "privilege()")public void afterReturning(joinpoint joinpoint、object result){}結果に保存されている返品値はメソッドです。
4。@AfterThrowing例外通知:ターゲットメソッドで例外が発生した場合にのみ実行されるコード。スロー属性は、メソッド本体の実行中にスローされる例外を表し、その値はメソッドの例外の値と一致する必要があります。
@afterthrowing(value = "privilege()"、throwing = "ex")public void cread(joinpoint joinpoint、exception ex){}3。テスト
コントローラーメソッドを作成します
@retscontroller@requestmapping( "/api/v1/dept")public class deptcontroller拡張basecontroller {/**ロギングクラス*/private logger log = loggerfactory.getLogger(getClass()); / **私自身のサービス*/ @Autowiredプライベートデプトサービスサービス。 /*** @Function説明:IDに基づいて部門コンテンツをクエリする方法* @return Dept*/@getMapping( "/id/get")public result getByid(string id)throws {verify(new verifyparam( "department id"、id));新しい結果を返します( "ID!"、service.querybyid(id)を介して取得しました); }}このようにして、コントローラー層の方法は非常に簡潔です。
テスト結果:
2018-04-10 22:59:27.468 Info 1460 --- [NIO-8088-EXEC-5] npro CeedlyJoinPoint $ MethodignatureImpl:GetByIDのフロントエンド要求パラメーターIS:22
2018-04-10 22:59:27.470 INFO 1460 --- [NIO-8088-EXEC-5] npro CeedingJoinPoint $ MethodsIgnuationImpl:メソッドはメッセージを返します。 createTime = Thu 4月19日23:38:37 CST 2018、edittime = null]]]
2018-04-10 22:59:27.470 INFO 1460 --- [NIO-8088-EXEC-5] nProCeachJoInPoint $ MethodsIgnatureImpl:GetByIDメソッドの実行時間は次のとおりです。
これにより、リクエストパラメーター、返品結果、実行時間などをエレガントで簡潔で簡潔な印刷で印刷できます。