aspectj-autoproxyコントローラーが有効にならない

 今週はビジネスニーズがあります。APIの応答時間を監視する必要があります。最初のアイデアは、監視が必要なAPIのログを許可し、ケア情報を記録できるようにすることです。最大の問題は、拡張が容易でないことです。各APIにほぼ同じコードを追加する必要があります。当時、Javaの一般的な慣習はスライスでした。Java言語によって提供されるリフレクション機能を、Springの3つの主要な特性の1つであるaop(アスペクト指向プログラミング)のアイデアと組み合わせることで、完全なデカップリングを追加することが可能になり、低カップリングでは、ポリプログラミングの原則では、より洗練されていますが、効率を犠牲にすることは避けられませんリフレクションはオブジェクトランタイムの動的な機能であり、追加のパフォーマンスが必要です。以前はプロジェクトに個別のスライスの導入はなかったと考え、コードの優雅さを維持しながら、スライスすることを決定しました。

手順

1.ビジネススライスコード  


@Aspect
@Component
public class ApiAspect {


@Around( "execution(* com.jinxu.api .. *。*(..))")
public Object apiLog(ProceedingJoinPoint joinPoint)throws Throwable {
Long startTime = 0l;
長いendTime = 0l;
オブジェクトの結果= null;
{
startTime = System.currentTimeMillis();を試してください
結果= joinPoint.proceed();
endTime = System.currentTimeMillis();
} catch(例外e){
スローe;
}最後に{
try {
Object [] args = joinPoint.getArgs();
オブジェクトオブジェクト= args [0];
if(object instanceof HttpServletRequest){
object =((HttpServletRequest)object).getParameterMap();
}
String method = joinPoint.getSignature()。GetName();
String request = JsonUtils.json(object); //ここでjsonとnon-jsonの対応に注意してください
String response = JsonUtils.json(result); //
logger.debug (String.format( "method:%s" + "-request:%s" + "-response:%s" + "-cost:%s"、method、request、response、endTime-startTime));
}キャッチ(例外e){
logger.error( "com.jinxu.apiパッケージスライス例外ですが、通常のビジネスには影響しません:" + e);
}
}
return result;
}
}
 導入されるjarパッケージは次のとおりです:

<dependency>
<groupId> org.aspectj </ groupId>
<artifactId> aspectjweaver </ artifactId>
</ dependency>
<dependency>
<groupId> org.springframework </
groupId > <artifactId> spring-aop </ ArtifactId>
</ dependency>
<dependency>
<groupId> cglib </ groupId>
<artifactId> cglib-nodep </ ArtifactId>
</ dependency>
  ここで、cglibは、Javaクラスを拡張し、実行時にJavaインターフェースを実装するコードです。これは、一般にjdkリフレクションの拡張です。 jdkを置き換えるために使用してください。
2.ファイルをロードするようにSpringを構成する

<!-AOP->
<aop:aspectj-autoproxy proxy-target-class = "true" />
  は、コードに@Aspectタグを含むスライスをロードできます。proxy-target-class属性の値は、それがインターフェイスであるかクラスであるかを決定しますエージェントが作成されました。proxy-target-class属性値がtrueに設定されている場合、cglibライブラリなどのクラスプロキシが機能します。proxy-target-class属性値がfalseに設定されている場合、またはこの属性が省略されている場合、標準のJDKインターフェースベースエージェント。その時点で、対応するインターフェースがなく、実装のみの場合、クラスプロキシが機能します。

3.問題

  スライスの使用に関しては、実際に他の多くのプロジェクトやオンライン資料があるため、それらは直接構成されます。実際のコントローラースライスが有効にならず、aopスライスが実行されなかったことがわかりました。一般に、他の構成を模倣してapplicationContext.xmlに配置することは機能するので、多くの情報を確認し、他のプロジェクトと比較すると、実際には利点がありません。

  適用されるアスペクトとBeanは同じApplicationContextにある必要がありますが、ApplicationContextは認識していません

 WebApplicationContext。 
  実際、コントローラー(@Controllerで注釈された)とアスペクト(@Aspectで注釈された)は同じSpringコンテキストにある必要があります。 

  通常、人々はコントローラをdispatch-servlet.xmlまたはxxx-servlet.xmlで定義し、サービスBean(アスペクトを含む)を

 メインのapplicationContext.xml。うまくいかないだろう。 

  SpringがMVCコンテキストを初期化すると、コントローラーのプロキシが作成されますが、アスペクトが同じコンテキストにない場合、Springはそれらのインターセプターを作成しません。 

  コントローラーがxxx-servlet.xml構成ファイルで定義されているため、applicationContext.xmlで定義されたアスペクトスライスは有効にならず、アスペクトの定義をxxx-servlet.xmlファイルに転送する必要があります。変更後、問題は解決します。問題が発生した場合は、上記の簡単な手順を参照できます。
————————————————
著作権に関する声明:この記事はCSDNブロガー「Xiaofeng Canyue xj」によるオリジナルの記事であり、CC 4.0 BY-SAの著作権契約に従います。再版用に元のソースリンクを添付してくださいそしてこの声明。
元のリンク:https://blog.csdn.net/xj2419174554/java/article/details/52626974

おすすめ

転載: www.cnblogs.com/sidesky/p/12717832.html