Apprentissage du cadre Spring5-Aop

Cet article a participé à l'événement "Newcomer Creation Ceremony" pour commencer ensemble la route de la création d'or.

Apprentissage du cadre Spring5-Aop

Dans l'apprentissage de l'article précédent, il existe déjà des packages de guides et des instructions pour créer des projets connexes. Vous pouvez vous référer à cet article d'apprentissage de base de Spring.

1. Qu'est-ce que l'AOP

AOP (Aspect Oriented Programming) signifie : programmation orientée aspect, une technologie qui réalise une maintenance unifiée des fonctions du programme grâce à des agents dynamiques de pré-compilation et d'exécution. AOP est la continuation de la POO, un point chaud du développement logiciel et une partie importante du framework Spring, c'est un paradigme dérivé de la programmation fonctionnelle. L'utilisation d'AOP peut isoler chaque partie de la logique métier, réduisant ainsi le couplage entre chaque partie de la logique métier, améliorant la réutilisabilité du programme et améliorant l'efficacité du développement.

image.png

2. Le rôle de l'AOP au printemps

Fournit des transactions déclaratives ; autorise les aspects définis par l'utilisateur

  • Préoccupations transversales : méthodes ou fonctions qui couvrent plusieurs modules d'une application. Autrement dit, la partie qui n'a rien à voir avec notre logique métier, mais la partie à laquelle nous devons prêter attention, est la préoccupation transversale. Tels que la journalisation, la sécurité, la mise en cache, les transactions, etc...
  • ASPECT : Un objet particulier dont les préoccupations transversales sont modularisées. C'est-à-dire que c'est une classe.
  • Conseil : Le travail que l'aspect doit faire. C'est-à-dire qu'il s'agit d'une méthode dans la classe.
  • Cible (Target): l'objet notifié.
  • Proxy : un objet créé après l'application d'une notification à l'objet cible.
  • Pointcut (PointCut): La définition du "lieu" où la notification d'aspect s'exécute.
  • JointPoint : Le point d'exécution qui correspond au point de coupure.

image.png

Dans Spring AOP, la logique transversale est définie par l'Avis. Spring supporte 5 types d'Avis :

  • Pré-notification -- Avant la méthode
  • Notification de publication - après la méthode
  • Notifications environnantes - méthodes avant et après
  • Notification de levée d'exception - la méthode lève une exception
  • Présentation des conseils - le dernier conseil de la classe, enfin

C'est-à-dire ajouter de nouvelles fonctions sans changer le code d'origine dans Aop

3. Couche inférieure AOP

Brève description : Ajouter de nouvelles fonctions à la fonction principale sans modifier le code source

1. La couche inférieure AOP utilise un proxy dynamique

1. Il existe une interface utilisant le proxy dynamique JDK

  • Créer une interface pour implémenter un objet proxy et améliorer la méthode de la classe

image.png

  • Pas d'interface pour utiliser le proxy dynamique CGLIB

Créer un objet proxy de la sous-classe pour améliorer la méthode de la classe

image.png

2. AOP (proxy dynamique JDK)

1. Utilisez l'objet proxy dynamique JDK et utilisez les méthodes de la classe Proxy pour créer l'objet proxy

image.pngAppelez la méthode newProxyInstance

image.png

Les trois paramètres de la méthode

  • chargeur -- chargeur de classe
  • Interface de classe - l'interface implémentée par la classe où se trouve la méthode d'amélioration, cela prend en charge plusieurs interfaces
  • InvocationHandler implémente cette interface, crée des objets proxy et écrit des méthodes améliorées

2. Le code proxy dynamique JDK implémente l'interface de création

package com.Spring.AOp;

public interface UserDao {
    public int add(int a,int b);
    public String update(String id);
}

复制代码

méthode d'implémentation d'interface

package com.Spring.AOp;

public class UserDaoImpl implements UserDao {
    @Override
    public int add(int a, int b) {
        System.out.println("add 方法执行");
        return a+b;
    }

    @Override
    public String update(String id) {
        System.out.println("update方法执行");
        return id;
    }
}

复制代码

Créer une classe Proxy pour implémenter l'objet proxy d'interface

package com.Spring.AOp;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class JDKProxy {
    public static void main(String[] args) {
        Class[] interfaces = {UserDao.class};
//            Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), new InvocationHandler() {
//                @Override
//                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//                    return null;
//
//            });
//
//                    }
        UserDaoImpl userDao = new UserDaoImpl();
        UserDao dao = (UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),interfaces, new UserDaoProxy(userDao));
        int result = dao.add(1,2);
        System.out.println("result"+result);
    }
                        //创建接口实现类代理对象
}
//代理对象代码
 class UserDaoProxy implements InvocationHandler {
    //将创建的代理对象,传入
    private Object obj;
    public UserDaoProxy(Object obj){
        this.obj = obj;
    }
    //增强的逻辑
     @Override
     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //方法之前执行
         System.out.println("方法之前执行..."+method.getName()+"传递的参数"+ Arrays.toString(args));
        //被增强的方法执行
         Object res =  method.invoke(obj,args);
        //方法之后执行
         System.out.println("方法之后执行.."+obj);
        return res;
     }
 }
复制代码

Je suppose que tu aimes

Origine juejin.im/post/7084892844007096357
conseillé
Classement