Principe de Spring aop : 1. AOP est orienté aspect et est un paradigme de programmation qui fournit une autre perspective pour considérer la structure du programme afin d'améliorer la programmation orientée objet POO 2. AOP fournit aux développeurs une description horizontale du mécanisme pour ; des préoccupations transversales et être capable d'intégrer automatiquement des préoccupations transversales dans des systèmes logiciels orientés objet.
Principe Spring Aop :
AOP (aspect orienté) est un paradigme de programmation qui offre une autre perspective Venez réfléchir structure du programme pour compléter la programmation orientée objet (POO).
AOP fournit aux développeurs un mécanisme pour décrire les préoccupations transversales et peut automatiquement intégrer les préoccupations transversales dans des systèmes logiciels orientés objet, réalisant ainsi la modularisation des préoccupations transversales.
AOP peut encapsuler une logique ou des responsabilités qui n'ont rien à voir avec l'entreprise mais qui sont communément appelées par des modules métier, tels que le traitement des transactions, la gestion des journaux, le contrôle des autorisations, etc., pour faciliter la réduction du code en double dans Le système et réduire le nombre de modules. Le degré de couplage est bénéfique pour l'opérabilité et la maintenabilité futures.
Avantages de l'utilisation d'AOP
Réduire le couplage des modules
Rendre le système facile à étendre
Améliorer la réutilisabilité du code
Concepts de base de l'AOP
JoinPoint : Nécessité d'insérer des lignes horizontales dans le programme En fonction de le point de préoccupation, le point de connexion peut être dans l'initialisation de classe, l'invocation de méthode, l'invocation de champ ou la gestion des exceptions, etc. Seuls les points de connexion d’exécution de méthode sont pris en charge dans Spring.
Pointcut : un ensemble de points de connexion associés.
Conseil : Un comportement effectué sur un point de connexion L'amélioration fournit un moyen d'étendre un comportement existant en AOP au point de connexion sélectionné par le point d'entrée. Y compris la pré-amélioration (avant le conseil), la post-amélioration (après le conseil) et l'amélioration surround (autour du conseil).
Aspect : La combinaison de notifications et de points d'entrée.
Tissage : le tissage est un processus d'application d'aspects à l'objet cible pour créer un objet proxy AOP.
Proxy : appliquez des aspects à l'objet cible via un proxy. Les proxys AOP peuvent être implémentés à l'aide de proxys dynamiques JDK ou de proxys CGLIB.
Cible : l'objet qui doit être tissé dans le focus. C'est-à-dire l'objet mandaté.
Le principal modèle de conception pour implémenter AOP est le proxy dynamique.
Il existe deux types de proxy dynamiques dans Spring : l'un est le proxy dynamique JDK ; l'autre est le proxy dynamique cglib.
Simulation de proxy dynamique JDK
Les deux interfaces principales (classes) du proxy dynamique JDK sont InvocationHandler et Proxy. Remarque : Seules les interfaces proxy peuvent être utilisées. La classe
public class TimeHandler implements InvocationHandler { // 目标对象 private Object targetObject; public TimeHandler(Object targetObject){ this.targetObject = targetObject; } @Override //关联的这个实现类的方法被调用时将被执行 /*InvocationHandler接口的方法,proxy表示代理,method表示原对象被调用的方法, args表示方法的参数*/ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object ret=null; try{ System.out.println("方法之前:"+System.currentTimeMillis()); //调用目标方法 ret=method.invoke(targetObject, args); System.out.println("方法之后:"+System.currentTimeMillis()); }catch(Exception e){ e.printStackTrace(); System.out.println("error"); throw e; } return ret; } }
TimeHandler implémente l'interface InvocationHandler. Implémentez la méthode principale Invocation, qui comporte 3 paramètres. Le premier paramètre est l'instance de classe proxy générée, le deuxième paramètre est la méthode de l'objet cible et le troisième paramètre est le tableau de valeurs de paramètre de la méthode.
public class ProxyUtil { @SuppressWarnings("unchecked") public static <T> T proxyOne(ClassLoader loader,Class<?>[] clz,InvocationHandler handler){ return (T)Proxy.newProxyInstance(loader, clz, handler); } }
La classe ProxyUtil encapsule simplement la méthode Proxy.newProxyInstance(). Cette méthode comporte également 3 paramètres. Le premier paramètre génère le chargeur de classe de l'objet proxy, le deuxième paramètre est le tableau d'interface de l'objet cible et le troisième paramètre est l'instance de classe qui implémente l'interface InvocationHandler.
public interface UserManager { public void addUser(String userId, String userName); } public class UserManagerImpl implements UserManager { @Override public void addUser(String userId, String userName) { System.out.println("addUser(id:"+userId+",name:"+userName+")"); } } public static void main(String[] args) { UserManager um=new UserManagerImpl(); LogHandler log =new LogHandler(um); um=ProxyUtil.proxyOne(um.getClass().getClassLoader(), um.getClass().getInterfaces(), log); TimeHandler time = new TimeHandler(um); um=ProxyUtil.proxyOne(um.getClass().getClassLoader(), um.getClass().getInterfaces(), time); um.addUser("1111", "张三"); }
À des fins de démonstration, un LogHandler est ajouté ici, qui est le même que le code TimeHandler.
Simulation de proxy dynamique CGLIB
Les deux interfaces principales (classes) du proxy dynamique CGLIB sont MethodInterceptor et Enhancer. Est-il très similaire au proxy dynamique JDK et son utilisation est similaire. Mais CGLIB peut proxy des classes et des interfaces. Remarque : Les classes finales ne peuvent pas être proxy. La méthode d'interception
public class TimeInterceptor implements MethodInterceptor { private Object target; public TimeInterceptor(Object target) { this.target = target; } @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy invocation) throws Throwable { System.out.println("方法之前:"+System.currentTimeMillis()); Object ret = invocation.invoke(target, args); System.out.println("方法之后:"+System.currentTimeMillis()); return ret; } }
a 4 paramètres. 1. Instance de classe proxy générée. 2. Référencé par la méthode de l'objet proxy. 3. Tableau de valeurs des paramètres de méthode. 4. La référence proxy de la classe proxy à la méthode.
public class ProxyUtil { @SuppressWarnings("unchecked") public static <T> T proxyOne(Class<?> clz,MethodInterceptor interceptor){ return (T)Enhancer.create(clz, interceptor); } }
La classe Enhancer est un exhausteur de bytecode dans CGLib.
public class UserManage { public void addUser(String userId, String userName) { System.out.println("addUser(id:"+userId+",name:"+userName+")"); } } public static void main(String[] args) { UserManage um = new UserManage(); TimeInterceptor time = new TimeInterceptor(um); um = ProxyUtil.proxyOne(um.getClass(), time); um.addUser("111", "老王"); }
Recommandations d'apprentissage gratuites associées : Tutoriel de base Java
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!