Le contrôleur aspectj-autoproxy ne prend pas effet

 Faites des affaires cette semaine, vous devez surveiller le temps de réponse de l'API. La première idée est d'autoriser les journaux dans les API qui doivent être surveillés et d'enregistrer les informations de maintenance. Le plus gros problème est qu'il n'est pas facile à étendre. Vous devez ajouter presque le même code dans chaque API. À cette époque, la pratique générale de Java était le découpage. En utilisant les capacités de réflexion fournies par le langage Java, combinées à l'idée aop (programmation orientée aspect) de l'une des trois principales caractéristiques du printemps, il était possible de découpler complètement l'ajout du découpage. Selon le principe de la programmation poly, il est plus élégant, mais il est inévitable de sacrifier l'efficacité.La réflexion est une caractéristique dynamique de l'exécution de l'objet et nécessite des performances supplémentaires. Pensant qu'il n'y avait pas d'introduction séparée de la découpe dans le projet auparavant, tout en conservant l'élégance du code, la décision a été de la découper.

Étapes

1. Code de tranche commerciale  


@Aspect
@Component
classe publique ApiAspect {


@Around ("execution (* com.jinxu.api .. *. * (..))")
public Object apiLog (ProceedingJoinPoint joinPoint) jette Throwable {
Long startTime = 0l;
Long endTime = 0l;
Résultat d'objet = null;
try {
startTime = System.currentTimeMillis ();
result = joinPoint.proceed ();
endTime = System.currentTimeMillis ();
} catch (Exception e) {
throw e;
} enfin {
try {
Object [] args = joinPoint.getArgs ();
Objet objet = args [0];
if (objet instanceof HttpServletRequest) {
object = (objet (HttpServletRequest)) .getParameterMap ();
}
Méthode de chaîne = joinPoint.getSignature (). GetName ();
requête de chaîne = JsonUtils.json (objet); // Notez ici la correspondance entre json et non-json
Réponse de chaîne = JsonUtils.json (résultat); //
logger.debug (String.format ("method:% s" + "-request:% s" + "-response:% s" + "-cost:% s", method, request, response, endTime-startTime));
} catch (Exception e) {
logger.error ("exception de découpage de package com.jinxu.api, mais n'affecte pas les activités normales:" + e);
}
}
return result;
}
}
 Les packages jar à introduire sont les suivants:

<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>
  où cglib est le code qui étend la classe Java et implémente l'interface Java au moment de l'exécution, qui est généralement l'extension de la réflexion jdk, généralement Utilisez-le pour remplacer jdk est livré avec plus disponible.
2. Configurer spring pour charger les fichiers

<! - AOP->
<aop: aspectj-autoproxy proxy-target-class = "true" />
  qui peut charger des tranches avec des balises @Aspect dans le code, la valeur de l'attribut proxy-target-class détermine s'il s'agit d'une interface ou d'une classe L'agent a été créé. Si la valeur d'attribut proxy-target-class est définie sur true, le proxy de classe fonctionnera, comme la bibliothèque cglib; si la valeur d'attribut proxy-target-class est définie sur false ou cet attribut est omis, alors l'interface JDK standard basée sur Agent. A ce moment, s'il n'y a pas d'interface correspondante, seule l'implémentation, le proxy de classe fonctionnera.

3. Problèmes

  Concernant l'utilisation des tranches, il existe en effet de nombreux autres projets et matériels en ligne, ils sont donc directement configurés. Il a été constaté que la tranche de contrôleur réelle n'a pas pris effet et que la tranche aop n'a pas été exécutée. En général, imiter d'autres configurations et les mettre dans applicationContext.xml fonctionnera, donc j'ai vérifié beaucoup d'informations et par rapport à d'autres projets, il n'y a pas de réel gain.

  Les aspects et les beans à appliquer doivent être dans le même ApplicationContext mais ApplicationContext n'a pas connaissance de

 WebApplicationContext. 
  En effet, votre contrôleur (annoté par @Controller) et vos aspects (annotés par @Aspect) devraient être dans le même contexte Spring. 

  Habituellement, les gens définissent leurs contrôleurs dans le dispatch-servlet.xml ou xxx-servlet.xml et leurs beans de service (y compris les aspects) dans le

 main applicationContext.xml. Ça ne marchera pas. 

  Lorsque Spring initialise le contexte MVC, il crée un proxy pour votre contrôleur mais si vos aspects ne sont pas dans le même contexte, Spring ne crée pas d'intercepteurs pour eux. 

  Traduit est que le contrôleur est défini dans le fichier de configuration xxx-servlet.xml, donc les tranches d'aspect définies dans applicationContext.xml ne prendront pas effet, et la définition des aspects doit être transférée dans le fichier xxx-servlet.xml. Le problème est résolu après la modification, si vous rencontrez, vous pouvez vous référer aux étapes simples ci-dessus.
————————————————
Déclaration de droit d'auteur: Cet article est un article original du blogueur du CSDN "Xiaofeng Canyue xj", suite à l'accord de copyright CC 4.0 BY-SA, veuillez joindre le lien source d'origine pour une réimpression Et cette déclaration.
Lien d'origine: https://blog.csdn.net/xj2419174554/java/article/details/52626974

Je suppose que tu aimes

Origine www.cnblogs.com/sidesky/p/12717832.html
conseillé
Classement