Points clés de cette section:
Proxy statique Java
Agent dynamique JDK
1 problèmes rencontrés dans les idées de conception orientées objet
Dans la programmation traditionnelle OOP, les objets sont centraux et une fonction logicielle complète est formée grâce à la collaboration entre les objets. Étant donné que les objets peuvent être hérités, nous pouvons abstraction des attributs avec les mêmes fonctions ou les mêmes caractéristiques dans un système de structure de classe clairement hiérarchique. Avec l'expansion continue des spécifications du logiciel, la division plus professionnelle du travail devient de plus en plus de séries, et le nombre croissant de pratiques d'application de la POO a également exposé certains problèmes que la POO ne peut pas bien résoudre.
Supposons maintenant qu'il existe trois pièces de code complètement similaires dans le système, qui sont généralement complétées par "copie" et "coller". Le logiciel développé de cette manière est illustré sur la figure:
Les lecteurs ont peut-être découvert les lacunes de cette approche. Si un jour le code avec un arrière-plan bleu doit être modifié, devrions-nous modifier trois places en même temps? Si non seulement ces trois endroits contiennent ce code, mais 100, voire 1 000 places, quelles seront les conséquences?
La journalisation est partout dans le code - regardez d'abord un exemple:
Afin de suivre le fonctionnement d'une application, de nombreuses méthodes nécessitent des informations de journalisation. Nous écrivons généralement ceci:
// Voir l'article "Log4j Introduction" pour log4j import org.apache.log4j.logger; public class personne {private logger logger = logger.getLogger (personne. Date ());} public void aliments () {logger.info ("Démarrer l'heure d'exécution:" + new Date ()); Date () "); System.out.println (" incubation "); logger.info (" "EXECUTION ENTRE:" + new Date () ");}}Question: Quels sont les inconvénients?
L confond les responsabilités de la méthode commerciale elle-même
La charge de travail de maintenance est énorme
2 Solution 1
Proxy statique:
1. Vous devez savoir quelle classe est la classe de base (classe proxy) et quelles méthodes y a-t-il.
2. Le code non essentiel doit être répété plusieurs fois, ce qui fait que la structure de code semble gonflée et crée une redondance de code.
3. Les classes non essentielles (classes proxy) doivent implémenter les interfaces implémentées par les classes de base (classes proxy), c'est-à-dire qu'elles doivent implémenter les interfaces communes, mais les interfaces implémentées par les classes de base (classes de proxy) doivent prévaloir.
Le but de L est de séparer complètement le code commercial du code journal et d'atteindre un couplage lâche.
L'objet proxy et l'objet proxy doivent implémenter la même interface, implémenter des services connexes pour la connexion dans l'objet proxy et appeler l'objet proxy en cas de besoin, tandis que l'objet proxy ne conserve que le code commercial.
Implémentation de proxy statique
1) Définissez l'interface:
Interface publique iperson {public abstract void sleep (); public abstract void aliating ();}2) Classe proxy
La classe de classe publique met en œuvre Iperson {public void sleep () {System.out.println ("Sleeping");} public void aliments () {System.out.println ("alimentaire");}}3) Classe d'agent
import org.apache.log4j.logger; public class PersonProxy implémente iperson {private iperson personne; private logger logger = logger.getLogger (personProxy.class); public personproxy (iperson personne) {this.person = personne;} public void alimentaire () {Logger.info ("Start Execution Time:" + new Date () "); personne.eating (); logger.info (" "Heure de fin d'exécution:" + new Date () ");} public void sleep () {Logger.info (" Démarrer l'heure d'exécution: "+ Nouvelle date de fin:" + New Date () ");}}4) Classe de test
package com.aptech.aop2; public class Persontest {public static void main (String [] args) {iperson proxy = new PersonProxy (new personne ()); proxy.eating (); proxy.sleep ();}}Inconvénients du proxy statique:
Une interface proxy ne peut servir qu'un seul type d'objet. Il est tout simplement incompétent pour des projets légèrement plus grands.
3 Solution Agent 2-dynamique
InvocationHandler: chaque classe de proxy dynamique doit implémenter l'interface invocationHandler, et chaque instance de la classe proxy est associée à un gestionnaire. Lorsque nous appelons une méthode via l'objet proxy, l'appel de cette méthode sera transmis à la méthode invoquée de l'interface invocationHandler pour l'appel.
Après JDK1.3, une fonction proxy dynamique qui peut aider au développement a été ajoutée. Il n'est pas nécessaire d'écrire des objets proxy spécifiques pour des objets et des méthodes spécifiques. L'utilisation de proxyage dynamique peut faire servir un gestionnaire de service.
La conception des classes d'un processeur doit implémenter l'interface java.lang.reflect.invocationhandler.
Le proxy dynamique implémenté via l'interface InvocationHandler ne peut que proxy ne peut que proxy la classe d'implémentation de l'interface.
Implémentation de proxy dynamique
1) gestionnaire
classe publique dynaproxyhandler implémente invocationhandler {private logger logger = logger.getLogger (dynaproxyhandler.class); cible d'objet privé; // objet proxy public void Settarget (objet Target) {this.target) Date ()); objet result = méthode.invoke (cible, args); logger.info ("Heure de fin d'exécution:" + new Date ()); Retour Résultat; // Retour Méthode Résultat d'exécution}}2) l'usine pour l'agent de production
import java.lang.reflect.proxy; public class dynaproxyfactory {// obj est l'objet proxy public static objet getProxy (objet obj) {dynaproxyhandler handler = new dynaproxyhandler (); handler.setTarget (obj); Proxy.newproxyinstance (obj.getClass (). GetClassOader (), obj.getClass (). GetInterfaces (), Handler);}}3) Classe de test
classe publique Persontest {public static void main (String [] args) {iperson personne = (iperson) dynaproxyfactory.getProxy (new Person ()); // renvoie la classe proxy, la classe proxy est créée dynamiquement par le JVM en mémoire. Cette classe met en œuvre toutes les interfaces (toutes les méthodes) du nouveau Array.Résumer
Ce qui précède est toute l'explication détaillée du proxy statique du ressort et du code de proxy dynamique dans cet article. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à ce site:
Configuration et analyse communes Description de la classe du printemps
SpringMVC Interceptor implémente une seule connexion
Java Programming Implémentation de SpringMVC Simple Login Exemple
S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!