序文
AOPは、アスペクト指向プログラミングの略語です。これは、オブジェクト指向プログラミングとは反対の概念です。オブジェクト指向プログラミングでは、オブジェクトに各機能を実装するために、カプセル化、継承、多型などの概念を採用する傾向があります。ただし、実際の状況では、多くのオブジェクトの多くの方法で機能の種類が必要であるという別の要件があることもわかりました。たとえば、データベースアクセスのいくつかの方法にはトランザクション管理要件があり、多くの方法でログを印刷する必要があります。オブジェクト指向の方法では、これらの同じ機能を多くの場所で実装するか、多くの場所で呼び出されなければなりません。これは非常に面倒であり、これらのビジネスに依存しない要件と密接に結びついています。そのため、後で、アスペクト指向のプログラミングがこのタイプの問題を解決するように見え、オブジェクト指向のプログラミングに適したサプリメントを作成しました
コンセプト
接線指向のプログラミングをよく理解するには、まずAOPのいくつかの概念を理解する必要があります。 Javaでは、AspectJはAOPの機能を比較的完全に完全に実装していますが、使用する方が複雑であるため、主にSpringのAOPについて説明します。 Spring AOPは、AOPのコア関数を実現するために、シンプルさと妥当性の原則を採用しています。最初にAOPの特定の概念について話しましょう
Sprinboot AOP実装
スプリングブートの基本的な使用について説明するために、いくつかの章を使用しました。そのため、ここではスプリングブートとAOPを使用して組み合わせて、すべてのRESTインターフェイス入力パラメーターを出力し、パラメーターを返す機能を出力する関数を実装します。
RESTサービス機能を実装します。
前の記事によると、最初に次の図に示すようにスプリングブートプロジェクトを構築します
デモプロジェクト
スプリングブートプロジェクトの構成
次のようにスプリングブートプロジェクトを構成します
サーバー:ポート:3030サーブレット:コンテキストパス: /aop-demospring:jackson:date-format:yyyy-mm-dd hh:mm:ss serialization:indent-output:truelogging:com.yanggch:debug
Jackson関連の構成は、オブジェクトをJSON文字列に出力し、出力をフォーマットすることです。
RESTインターフェイスを実装するコントローラークラス
ここでは、2つのRESTインターフェイスを実装します。 1つは、こんにちは情報を返すことです。 1つは、入力に基づいてログイン情報を返すことです。
パッケージcom.yanggch.demo.aop.web; import com.yanggch.demo.aop.domain.loginentity; Import com.yanggch.demo.demo.demo.demain.securityentity; Import org.springframework.web.bind.annotation.Annotation.patherable; inmolg.springframework.bind.bint. org.springframework.web.bind.annotation.requestmapping; Import org.springframework.web.bind.annotation.requestmethod; import org.springframework.web.bind.annotation.restcontroller; import java.util.date; @since:2018-05-27 */ @restcontroller @requestmapping( "/api/v1/security")public class securityapi { @requestmapping(value = "/login/{shopid}"、method = requestmethod.post)公共安全保障loge(@requestbody logintity logintity logeentity logeentity) SecurityEntity(); SecurityEntity.setshopid(ShopID); SecurityEntity.setAccount(loginentity.getaccount()); SecurityEntity.setpwd(loginentity.getpwd()); SecurityEntity.setLogIntime(new Date());セキュリティを返す; } @requestMapping(value = "/echo/{name}"、method = requestmethod.get)public string login( @pathvariable string name){return "hello、" + name; }}まず、入力パラメーターを出力し、すべてのRESTインターフェイスの結果をAOP関数を介してログに返すことを希望します。
Web AOP関数を実装します。
パッケージcom.yanggch.demo.aop.comment; Import com.fasterxml.jackson.databind.objectmapper; Import org.aspectj.lang.joinpoint; Import org.aspectj.lang.annotation.Aspect; Import org.aspectj.lang.annotation.before org.slf4j.loggerfactory; import org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotype.component; import org.springframework.web.web. javax.servlet.http.httpservletrequest;インポートjavax.servlet.http.httpservletresponse;/*** webインターフェイスlog** @author:yang gaochao* @since:2018-05-27*/ @aspect @componentbublic weblogaspect {private static gregger loggerfactory.getLogger(weblogaspect.class);プライベートファイナルオブジェクトマッパーマッパー。 @autowired public weblogaspect(objectmapper mapper){this.mapper = mapper; } @pointcut( " @annotation(org.springframework.web.bind.annotation.requestmapping)")public void weblog(){} @before( "weblog()")public void dobefore(joinpoint joinpoint){for(object object:joinpoint.getargs(){if(intercance intancefof futpip futp futpip futpip fimpaptfip fime | httpservletrequest ||。 } try {if(log.isdebugenabled()){log.debug(joinpoint.getTarget()。getName()。getName() + "。" + joinpoint.getSignature()。 }} catch(例外e){e.printstacktrace(); }}} @AfterReturning(Repurning = "Response"、PointCut = "weblog()")public void doafterturning(object response)throws {if(response!= null){log.debug( "response parameter:" + mapper.writevalueasstring(response)); }}}ここに注意を払うべきことがいくつかあります。
テスト
前景では、リクエストは郵便配達員を通じて開始され、バックグラウンドログの入力結果は次のとおりです。
2018-05-27 19:58:42.941 DEBUG 86072 --- [NIO-3030-EXEC-4] C.YANGGCH.DEMO.AOP.COOMMENT.WEBLOGASPECT:com.yanggch.demo.aop.web.securtyapi.login:リクエストパラメーター:{{{{{
「アカウント」:「Yanggch」、
「PWD」:「123456」
}
2018-05-27 19:58:42.941 DEBUG 86072 --- [NIO-3030-EXEC-4] C.YANGGCH.DEMO.AOP.COOMMEMNT.WEBLOGASPECT:com.yanggch.demo.aop.web.securtyapi.login:リクエストパラメーター:2001
2018-05-27 19:58:42.942 Debug 86072 --- [NIO-3030-EXEC-4] C.YANGGCH.DEMO.AOP.COOMMENT.WEBLOGASPECT:応答パラメーター:{{{
「Shopid」:2001、
「アカウント」:「Yanggch」、
「PWD」:「123456」、
「logintime」:「2018-05-27 11:58:42」
}
2018-05-27 19:58:45.796 DEBUG 86072 - [NIO-3030-EXEC-5] C.YANGGCH.DEMO.AOP.COMMENT.WEBLOGASPECT:com.yanggch.demo.aop.web.securitypi.echo:リクエストパラメーター: "yanggch" "" yanggch ""
2018-05-27 19:58:45.796 DEBUG 86072 - [NIO-3030-EXEC-5] C.YANGGCH.DEMO.AOP.COOMMENT.WEBLOGASPECT:応答パラメーター: "Hello、Yanggch"
これから、RESTインターフェイスメソッドにログを出力するためのコードを記述していませんが、エントリパラメーターを出力するためのコードを自動的に追加し、AOPを介して各休憩所にパラメーターを返すことができ、正しく実行できます。
その他の指示
PointCutのアドバイスの種類とAOP式の言語については、前述のことです。特定の参照については、次のように参照してください。
アドバイスタイプ
AOP式言語
1。メソッドパラメーターマッチング
@args()
2。メソッド説明マッチング
実行(Modifiers-Pattern?RetType-Pattern宣言-Type-Pattern?name-pattern(param-pattern)throws-pattern?)
型パターン、名前パターン、パラメーターパターンを返す必要があります。
。 Ret-Type-Pattern:リターン値、フルパスなどを表すクラス名にすることができます。
*。 name-pattern:メソッド名を指定し、 *すべてを表します
.setは、セットから始まるすべてのメソッドを表します。
。パラメーターパターン:メソッドパラメーター(宣言されたタイプ)、(..)を指定し、すべてのパラメーターを表し、()は1つのパラメーターを表します
。 (、文字列)は、最初のパラメーターが任意の値であり、2番目のパラメーターが型文字列であることを意味します。
3.現在のAOPプロキシオブジェクトタイプマッチング
4。ターゲットクラスのマッチング
@ターゲット()
@内で()
5。この注釈でマークされた一致方法
@Annotation()
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。