Préface
AOP est l'abréviation de la programmation orientée vers l'aspect. C'est un concept opposé à la programmation orientée objet. Dans la programmation orientée objet, nous avons tendance à adopter des concepts tels que l'encapsulation, l'héritage et le polymorphisme pour mettre en œuvre chaque fonction dans l'objet. Cependant, dans des situations réelles, nous avons également constaté qu'il existe une autre exigence selon laquelle un type de fonction est nécessaire dans de nombreuses méthodes de nombreux objets. Par exemple, certaines méthodes d'accès à la base de données ont des exigences de gestion des transactions et de nombreuses méthodes nécessitent des journaux d'impression. D'une manière orientée objet, ces mêmes fonctions doivent être implémentées dans de nombreux endroits ou appelées dans de nombreux endroits. Ceci est très lourd et est trop étroitement associé à ces exigences indépendantes de l'entreprise. Ainsi, plus tard, la programmation axée sur l'aspect semblait résoudre ce type de problème et a fait de bons suppléments à la programmation orientée objet
concept
Pour bien comprendre la programmation orientée tangente, vous devez d'abord comprendre certains concepts d'AOP. Dans Java, AspectJ met en œuvre les fonctions d'AOP d'une manière relativement complète, mais il est également plus complexe à utiliser, donc voici principalement pour discuter de l'AOP de Spring. Le printemps AOP adopte le principe de simplicité et d'adéquation pour réaliser les fonctions centrales de l'AOP. Parlons d'abord des concepts spécifiques de l'AOP
Implémentation Sprinboot AOP
Nous avons utilisé plusieurs chapitres pour décrire l'utilisation de base de Springboot. Nous utilisons donc ici Springboot et AOP pour combiner pour implémenter une fonction de sortie de tous les paramètres d'entrée d'interface de repos et de journaux de paramètres de retour.
Implémentez la fonction de service de repos.
Selon l'article précédent, nous allons d'abord construire un projet Springboot comme indiqué dans la figure suivante
projet de démonstration
Configuration du projet Springboot
Nous configurons les projets Springboot comme suit
Serveur: Port: 3030 Servlet: Path de contexte: / AOP-Demospring: Jackson: Date-Format: Yyyy-mm-dd HH: MM: SS SÉRIALISATION:
La configuration liée à Jackson consiste à sortir des objets en chaînes JSON et à formater la sortie.
Classe de contrôleur qui implémente une interface de repos
Ici, nous implémentons deux interfaces de repos. L'une consiste à retourner Hello Information. L'une consiste à renvoyer les informations de connexion en fonction de l'entrée.
package com.yanggch.demo.aop.web; import com.yanggch.demo.aop.domain.logintity; import com.yanggch.demo.aop.domain.securityentity; import org.springframework.web.bind.annotation.pathvariable; import; org.springframework.web.bind.annotation.requestbody; import org.springframework.web.bind.annotation.requestmapping; Import org.springframework.web.bind.annotation.requestMethod; import java.util.date; / ** * Service de repos lié à la sécurité * * @Author: Yang Gaochao * @Since: 2018-05-27 * / @ restController @ requestMapping ("/ api / v1 / Security") public Securityapi {@RequestMapping (valeur) Login (@Requestbody Loginentity Loginentity, @PathVariable Long ShopId) {SecurityEntity SecurityEntity = new SecurityEntity (); SecurityEntity.SetShopId (SHOPID); SecurityEntity.SetAccount (Loginentity.getAccount ()); SecurityEntity.SetPwd (Loginentity.getPwd ()); SecurityEntity.SetLogInTime (new Date ()); retourner la sécurité de la sécurité; } @RequestMapping (value = "/ echo / {name}", méthode = requestMethod.get) public String Login (@Pathvariable String name) {return "Hello," + name; }}Tout d'abord, nous voulons publier les paramètres d'entrée et renvoyer les résultats de toutes les interfaces de repos au journal via la fonction AOP.
Implémentez les fonctions Web AOP.
package 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; import org.aspectj.lang.annotation.pointcut; org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.beans.factory.annotation.autowired; import org.springframework.sterreotype.component; import org.springframework.web.multipart.multipartFile; import Importer; import; javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * web interface log* * @author: Yang Gaochao* @since: 2018-05-27 */@Aspect@Componentpublic class WebLogAspect { private static Logger log = LoggerFactory.getLogger (weblogaspect.class); Mappeur d'objet final privé; @Autowired public weblogaspect (objectMapper mapper) {this.mapper = mapper; } @Pointcut ("@ annotation (org.springframework.web.bind.annotation.requestmapping)") public void Weblog () {} @before ("objet objet: joingPoint.getar HttpServletRequest || Instance d'objet HttpServletResponse) {Continuer; } essayez {if (log.isdebugeNabled ()) {log.debug (joinpoint.getTarget (). getClass (). getName () + "." + joinpoint.getSignature (). getName () + ": request Paramètre:" + mapper.writeValueaSString (objet)); }} catch (exception e) {e.printStackTrace (); }}} @Afterreturning (returning = "réponse", pointCut = "weblog ()") public void doafterreturning (Object Response) lance Throwsable {if (réponse! = Null) {log.debug ("Response Paramètre:" + mapper.writeValueAssstring (réponse)); }}}Voici quelques éléments auxquels faire attention.
test
Au premier plan, la demande est lancée via Postman, et le résultat d'entrée du journal d'arrière-plan est le suivant
2018-05-27 19:58:42.941 DEBUG 86072 --- [nio-3030-exec-4] c.yanggch.demo.aop.comment.WebLogAspect : com.yanggch.demo.aop.web.SecurityApi.login : request parameter : {
"compte": "yanggch",
"PWD": "123456"
}
2018-05-27 19: 58: 42.941 Debug 86072 --- [Nio-3030-EXEC-4] C.Yanggch.demo.aop.comment.weblogaspect: com.yanggch.demo.aop.web.securityapi.login: Paramètre de la demande: 2001
2018-05-27 19: 58: 42.942 Debug 86072 --- [Nio-3030-EXEC-4] C.Yanggch.demo.aop.comment.weblogaspect: Paramètre de réponse: {
"Shopid": 2001,
"compte": "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.securityapi.echo: Paramètre de la demande: "Yanggch"
2018-05-27 19: 58: 45.796 Debug 86072 --- [Nio-3030-EXEC-5] C.Yanggch.demo.aop.comment.weblogaspect: Paramètre de réponse: "Bonjour, yanggch"
À partir de cela, nous pouvons voir que bien que nous n'écrivons pas le code pour la sortie de la connexion dans la méthode d'interface de repos, nous pouvons automatiquement ajouter le code pour la sortie des paramètres d'entrée et les paramètres de retour à chaque méthode d'entrée de repos via AOP et l'exécuter correctement.
Autres instructions
Les types de conseils et le langage d'expression AOP pour Pointcut sont mentionnés plus tôt. Pour des références spécifiques, veuillez les référer comme suit.
Type de conseil
Langue d'expression AOP
1. correspondance des paramètres de méthode
@args ()
2. Méthode Description correspondant
Exécution (Modificateurs-Pattern? RET-Type-Pattern Declating-Type-Pattern? Name-Pattern (param-Pattern) lance-Pattern?)
où le modèle de type de retour, le motif de nom et le motif de paramètres sont nécessaires.
. Ret-Type-Pattern: peut être un nom de classe qui représente n'importe quelle valeur de retour, chemin complet, etc.
*. Nom-Pattern: Spécifiez le nom de la méthode, * représente tout
.Set représente toutes les méthodes à partir de l'ensemble.
. Paramètres Modèle: Spécifiez les paramètres de la méthode (type déclaré), (..) représente tous les paramètres, et () représente un paramètre
. (, String) signifie que le premier paramètre est n'importe quelle valeur et que le second est de type chaîne.
3. Current AOP Proxy Object Type correspondant
4. correspondance de classe cible
@cible()
@dans()
5. Méthodes de correspondance marquées de cette annotation
@annotation()
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.