En ce qui concerne l'AOP, vous penserez certainement au printemps parce que cette chose est trop puissante. Mais vous devez être clair que l'AOP est une idée de programmation, et Spring n'est qu'une implémentation d'AOP.
Tout d'abord, Baidu:
Dans l'industrie du logiciel, AOP est l'abréviation de la programmation orientée vers l'aspect, ce qui signifie: une technologie qui met en œuvre le maintien unifié des fonctions de programme grâce à des méthodes de précompilation et des agents dynamiques pendant l'exécution. AOP est une continuation de la POO, un sujet brûlant dans le développement de logiciels, une partie importante du cadre de printemps et un paradigme dérivé de la programmation fonctionnelle. Les différentes parties de la logique commerciale peuvent être isolées en utilisant AOP, réduisant ainsi le couplage entre les différentes parties de la logique métier, améliorant la réutilisabilité du programme et améliorant l'efficacité du développement.
Aujourd'hui, utilisons le proxy natif Java pour implémenter des fonctions AOP simples.
Tout d'abord, vous devez connaître les connaissances de base de la réflexion, sinon vous pouvez vous sentir confus.
Plus de mots, commencez juste à taper
Tout d'abord, écrivons une interface simple. Le nom est AnimalInterface, qui est utilisé pour déclarer certaines méthodes de base pour réguler les animaux.
Ces méthodes comprennent la définition de noms, l'obtention de noms, d'appels et d'attributs (pardonnez-moi de ne pas avoir été éduqué, en fait, c'est pour obtenir s'il est terrestre ou aquatique ou amphibie)
package proxy.imp; interface publique AnimalInterface {// définit le nom void setName (nom de chaîne); // Obtenez le nom String getName (); // appelle void sait (); // Obtenez le Void GetProperty permanent ();}Ensuite, nous implémentons cette interface et créons un chien nommé Xiao Hei
Package Proxy; import proxy.imp.animalinterface; public class dogImp implémente AnimalInterface {private string name = "xiaohei"; public dogImp () {} @Override public void setName (String name) {this.name = name; } @Override public String getName () {return this.name; } @Override public Void Says () {System.out.println ("Puppy: laine de laine ......"); } @Override public void getProperty () {System.out.println ("Puppy est un animal terrestre, mais peut nager"); }} Tout le monde doit être impatient de réaliser des fonctions de type AOP ...
Créons d'abord une classe appelée Aophandle pour implémenter l'interface InvocationHandler. Lorsque vous ne pouvez pas utiliser Invoke, proxy comme paramètre de réflexion, car l'interface de l'objet proxy est différente d'un objet, ce mécanisme proxy est orienté vers l'interface plutôt que orienté vers la classe. Si vous utilisez le proxy, cela provoquera une récursivité infinie. Ensuite, il y a un débordement de pile, mais il peut toujours refléter avec succès une fois. Cela montre que l'objet proxy et le proxy de l'objet sont différents. Cependant, nous pouvons obtenir l'objet de classe via proxy.getClass () du paramètre proxy, puis obtenir les méthodes et les paramètres de la classe proxy. Cela fournit également une méthode d'implémentation pour l'injection d'annotation, l'injection de méthode spécifique et l'injection d'attribut. Parlons de cela plus tard.
Package Proxy; import java.lang.reflect.invocationhandler; import java.lang.reflect.method; public class aophandle implémente invocationhandler {// SAVE objet objet privé objet o; public aophandle (objet o) {this.o = o; } / ** * Cette méthode sera appelée automatiquement, le mécanisme de proxy dynamique Java sera passé dans le paramètre suivant * @param objet proxy L'interface de l'objet proxy, différent de l'objet * @param méthode méthode appelée méthode * @param objet [] paramètres de méthode args * Lorsque vous ne pouvez pas utiliser l'invocation, proxy comme paramètre de réflexion, parce que l'interface de l'objet Proxy est différent de l'objet *. Ce mécanisme de proxy est orienté vers l'interface, et non orienté vers la classe ** / @Override Object Invoke (proxy d'objet, méthode de la méthode, objet [] args) lève le throwable {// la valeur de retour de la méthode objet Ret = null; // Imprimer le nom de la méthode System.err.println ("Méthode d'exécution:" + Method.getName () + "N Type de paramètre est:"); // Print Paramètre pour (Type de classe: méthode.getParameterTypes ()) System.err.println (type.getName ()); // Imprimer le type de retour System.err.println ("Retour Type de données:" + Method.GetRetTurnType (). GetName ()); // Appel de réflexion Méthode ret = méthode.invoke (o, args); // Déclare le System End.err.println ("End Exécution de la méthode"); // renvoie la valeur de retour de la méthode d'appel réfléchissante return ret; }}Le proxy dynamique a été achevé ... et puis notre AnimalFactory ... et continuons
package proxy; import java.lang.reflect.proxy; public class animalFactory {/ *** * get object méthode * @param obj * @return * / private static objet getanimalbase (objet obj) {// get proxy objet return proxy.newproxyinstance (obj.getclass (). getClassloader (),) obj.getClass (). getInterfaces (), new AoPhandle (obj)); } / *** * Get Object Method * @param obj * @return * / @SuppressWarnings ("Unchecked") public static t getanimal (objet obj) {return (t) getanimalBase (obj); } / *** * Get Object Method * @param classname * @return * / @suppresswarnings ("Unchecked") public static t getanimal (string className) {objet obj = null; essayez {obj = getanImalBase (class.forname (className) .newInstance ()); } catch (exception e) {e.printStackTrace (); } return (t) obj; } / *** * Get Object Method * @param clz * @return * / @SuppressWarnings ("Unchecked") public static t getanimal (class clz) {objet obj = null; essayez {obj = getanImalBase (clz.newinstance ()); } catch (exception e) {e.printStackTrace (); } return (t) obj; }} Enfin, c'est la fin ... qu'est-ce qui manque? Venez ici pour voir l'effet ...
Haha ... serveur, je serai ... oh ~ non, c'est une catégorie de test ... haha ///
Package proxy; import org.junit.test; import org.junit.runner.runwith; import org.junit.runners.blockjunit4classrunner; import proxy.animalfactory; import proxy.imp.animalinterface; @runwith (blockjunit4classrunner.class) Class public aopts {@Test Test1 () {AnimalInterface Dog = AnimalFactory.getanImal (dogImp.class); dog.say (); System.out.println ("Mon nom est" + dog.getName ()); dog.setname ("ergouzi"); System.out.println ("Mon nom est" + dog.getName ()); }} Quoi? Qu'est-ce que, en fin de compte, c'est utile, n'est-ce pas une astuce? Capturez simplement cette chose, à quoi sert ...
Quel genre de AOP, pourquoi je ne vois pas AOP, comment puis-je saisir la méthode personnalisée? Juste une contribution de Syso et tromper le public dedans?….
OK, allons-y et voyons comment implémenter la méthode personnalisée injectée ...
Tout d'abord, ajoutez une interface, appelons-le l'interface d'injection AOP. Nommez-le AopMethod
Créer des méthodes après et avant, recevoir un proxy d'objet, méthode de la méthode, paramètres d'objet [] args
Cela fera plus de choses ... par exemple, avant d'exécuter la méthode, enregistrez l'état de la classe, écrivez le journal. Surveiller la variable xx ,,,
Ouvrez votre cerveau.
package proxy.imp; import java.lang.reflect.method; interface publique aopMethod {// méthode exécutée avant que la méthode d'instance ne soit exécutée void après (proxy objet, méthode de la méthode, objet [] args); // Méthode exécutée après que la méthode d'instance est exécutée vide avant (proxy objet, méthode de la méthode, objet [] args);} Modifiez ensuite la classe Aophandle et ajoutez la propriété AopMethod.
Modifiez la méthode du constructeur pour obtenir une instance AOPMethod lorsque l'initialisation de la classe.
Enfin, modifiez la méthode Invoke .... Accédez directement au code
Package Proxy; import java.lang.reflect.invocationhandler; import java.lang.reflect.method; import proxy.imp.aopMethod; public class AoPhandle implémente invocationhandler {// Enregistrer l'objet privé aopMethod Method; objet privé o; public aophandle (objet o, méthode aopMethod) {this.o = o; this.method = méthode; } / ** * Cette méthode sera appelée automatiquement, le mécanisme de proxy dynamique Java * Le paramètre suivant sera transmis dans * @param objet proxy L'interface de l'objet proxy est différente de l'objet * @param méthode méthode appelée méthode * @param objet [] Paramètres de méthode Args * Lorsque l'invoken Interface orienté vers l'interface, pas orienté vers la classe ** / @Override Objet public invoquer (proxy objet, méthode de la méthode, objet [] args) lève le throwable {objet ret = null; // Le lieu de modification est ici ce.method.before (proxy, méthode, args); ret = méthode.invoke (o, args); // Le lieu de modification est ici ce.method.after (proxy, méthode, args); retour retour; }} Huhu, la tâche est terminée, il semble que tout soit un problème, mignon ...
Mettez à jour la classe de test maintenant ...
package proxy;import java.lang.reflect.Method;import org.junit.runner.RunWith;import org.junit.runners.BlockJUnit4ClassRunner;import proxy.imp.AOPMethod;import proxy.imp.AnimalInterface;@RunWith(BlockJUnit4ClassRunner.class)public class AOPTest { public statique void main (String [] args) {animalInterface dog = animalfactory.getanimal (dogImp.class, new aopMethod () {// voici la méthode de coupe AOP avant la méthode exécution publique avant (proxy objet, méthode de la méthode, objet [] args) {System.err.prindPrintln ("I'm in" + méthode.getName () + "Exécuter avant l'exécution de la méthode"); Méthode de coupe AOP après l'exécution de la méthode VOID Public après (Proxy d'objet, méthode de la méthode, objet [] args) {System.err.println ("Je suis dans" + Method.getName () + "Exécuter après l'exécution de la méthode");}}); dog.say (); String name1 = "Mon nom est" + dog.getName (); System.out.println (name1); dog.setname ("ergouzi"); String name2 = "Mon nom est" + dog.getName (); System.out.println (name2); }} Huhu, mon cher, avez-vous envie d'injecter? Avez-vous l'impression d'avoir coupé votre propre méthode ??? Haha…
Il semble que tout soit parfait, mais je pense toujours que quelque chose manque? Oh, oui, il y a un manque de fichiers de configuration comme Spring.
En fait, ceux-ci sont déjà très simples. Laissons-les. Concevez simplement le format XML et attendez, que dites-vous? Vous ne pouvez pas intercepter les méthodes personnalisées?
Vous ne pouvez pas intercepter les méthodes personnalisées comme le printemps? OH ~~ Non, en fait, vous pouvez utiliser la méthode et la méthode pour porter un jugement avant (proxy objet, méthode de la méthode, objet [] args) pour utiliser la méthode et donner la méthode.
Bien sûr, cet exemple n'a aucune signification pratique, et il ne peut pas être comparé à divers cadres AOP parfaits. Cet article ne vous fournit qu'une façon de penser, mais vous devez vous rappeler que peu importe à quel point les choses sont géniales, elles se sont accumulées petit à petit
Exemple de téléchargement: http://xiazai.vevb.com/201701/yuanma/javaaop_jb51.rar
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.