Wichtige Punkte dieses Abschnitts:
Java statischer Proxy
JDK Dynamic Agent
1 Probleme, die in objektorientierten Designideen auftreten
In der herkömmlichen OOP -Programmierung sind Objekte Kern und eine vollständige Softwarefunktion wird durch Zusammenarbeit zwischen Objekten gebildet. Da Objekte vererbt werden können, können wir Attribute mit denselben Funktionen oder den gleichen Eigenschaften in ein klar hierarchisches Klassenstruktursystem abstrakten. Mit der kontinuierlichen Ausweitung der Softwarespezifikationen wird die professionelle Arbeitsteilung immer mehr Serien, und die zunehmende Anzahl von OOP -Anwendungspraktiken hat auch einige Probleme aufgetragen, die OOP nicht gut lösen kann.
Nehmen wir nun an, es gibt drei völlig ähnliche Code -Teile im System, die normalerweise durch "Kopieren" und "Einfügen" abgeschlossen werden. Die auf diese Weise entwickelte Software ist in der Abbildung dargestellt:
Die Leser haben möglicherweise die Mängel dieses Ansatzes entdeckt. Wenn der Code eines Tages mit einem blauen Hintergrund geändert werden muss, sollten wir dann drei Plätze gleichzeitig ändern? Wenn nicht nur diese drei Orte diesen Code enthalten, sondern auch 100 oder sogar 1.000 Plätze, was werden die Konsequenzen sein?
Die Protokollierung befindet sich überall im Code - sehen Sie sich zunächst ein Beispiel an:
Um den Betrieb einer Anwendung zu verfolgen, erfordern viele Methoden Protokollierungsinformationen. Wir schreiben normalerweise Folgendes:
// Siehe Artikel "log4j Einführung" für log4j import org.apache.log4j.logger; public class Person {private logger logger = logger.getLogger (Person.Class); public void sleep () {logger.info ("Start Execution Time:" + New Date (). Date ());} public void ess () {logger.info ("Ausführungszeit starten:" + neues Datum ()); Date () "); System.out.println (" Inkubation "); logger.info (" "Ausführungsendzeit:" + neues Datum () ");}}Frage: Was sind die Nachteile?
l verwirrt die Verantwortlichkeiten der Geschäftsmethode selbst
Die Wartungsarbeit ist riesig
2 Lösung 1
Statischer Proxy:
1. Sie müssen wissen, welche Klasse die Kernklasse (Proxy -Klasse) ist und welche Methoden da sind.
2. Nicht-Core-Code muss mehrmals wiederholt werden, wodurch die Codestruktur aufgebläht zu sein scheint und die Code-Redundanz erstellt.
3.. Nicht-Core-Klassen (Proxy-Klassen) müssen von Kernklassen (Proxy-Klassen) implementierte Schnittstellen implementieren, dh sie müssen gemeinsame Schnittstellen implementieren.
Der Zweck von L ist es, die Geschäftsordnung vollständig vom Protokollcode zu trennen und eine lockere Kopplung zu erreichen.
LDie Proxy -Objekt und das Proxy -Objekt müssen dieselbe Schnittstelle implementieren, verwandte Dienste für die Protokollierung im Proxy -Objekt implementieren und das Proxy -Objekt bei Bedarf aufrufen, während das Proxy -Objekt nur die Geschäftsordnung behält.
Implementierung von statischer Proxy
1) Definieren Sie die Schnittstelle:
public interface iperson {public abstract void sleep (); public abstract void ess ();}2) Proxy -Klasse
public class Person implementiert iperson {public void sleep () {system.out.println ("schlafe");} public void esse () {System.out.println ("Essen");}}3) Agentenklasse
import org.apache.log4j.logger; public class personproxy implementiert iperson {private iperson person; private logger logger = logger.getLogger (PersonProxy.class); public personProxy (iperson Person) {this.person = Person;} Public void () {logger.info ("Execution Time:" + New New ". Date () "); Person.eating (); logger.info (" "Ausführungsende Endzeit:" + new Date () ");} public void sleep () {logger.info (" Ausführungszeit starten: " + new Date ()"); Person.sleep ();4) Testklasse
Paket com.aptech.aop2; personaler personalTest {public static void main (String [] args) {iperson proxy = new PersonProxy (New Person ()); Proxy.eating (); Proxy.sleep ();}}Nachteile des statischen Proxy:
Eine Proxy -Schnittstelle kann nur einen Objekttyp bedienen. Es ist einfach inkompetent für etwas größere Projekte.
3 Lösung 2-Dynamic Agent
InvocationHandler: Jede dynamische Proxy -Klasse muss die InvocationHandler -Schnittstelle implementieren, und jede Instanz der Proxy -Klasse ist einem Handler zugeordnet. Wenn wir eine Methode über das Proxy -Objekt aufrufen, wird der Anruf dieser Methode an die Invoke -Methode der InvocationHandler -Schnittstelle für den Anruf weitergeleitet.
Nach JDK1.3 wurde eine dynamische Proxy -Funktion hinzugefügt, die bei der Entwicklung helfen kann. Es ist nicht erforderlich, bestimmte Proxy -Objekte für bestimmte Objekte und Methoden zu schreiben. Durch die Verwendung von dynamischem Proxying kann ein Handler jedes Objekt dienen.
Das Klassendesign eines Prozessors muss die Schnittstelle von java.lang.reflect.invocationHandler implementieren.
Dynamic Proxy, die über die InvocationHandler -Schnittstelle implementiert wurde, kann nur die Implementierungsklasse der Schnittstelle vorstellen.
Dynamische Proxy -Implementierung
1) Handler
public class dynaproxyHandler implements invocationHandler {private logger logger = logger.getLogger (dynaproxyHandler.class); privates Objektziel; // Proxy -Objekt public void settarget (Objektziel) {this.target = target;} öffentliche Objekt Invoke (Objekt proxy, methods methode, methods -methode [] args) throws throws throws {logger. Date ()); Object Ergebnis = Methode.invoke (Ziel, args); logger.info ("Ausführungsendzeit:" + neues Datum ()); Rückgabeergebnis; // Rückgabemethode Ausführung Ergebnis}}2) Fabrik für den Produktionsagenten
importieren java.lang.reflect.proxy; public class dynaproxyfactory {// obj ist das Proxy -Objekt Public static Object GetProxy (Objekt obj) {dynaproxyHandler Handler = new DynaproxyHandler (); Handler.Settarget (obj). obj.getClass (). getInterfaces (), Handler);}}3) Testklasse
öffentliche Klasse PersonTest {public static void main (String [] args) {iperson person = (iperson) dynaproxyfactory.getProxy (new Person ()); // RECHT Die Proxy -Klasse, die Proxy -Klasse wird dynamisch durch das JVM im Gedächtnis erstellt. Diese Klasse implementiert alle Schnittstellen (alle Methoden) des eingehenden Schnittstellenarray.person.eating (); Person.sleep ();}}Zusammenfassen
Das obige ist die detaillierte Erklärung des statischen Federproxy und des dynamischen Proxy -Code in diesem Artikel. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf diese Seite verweisen:
Häufige Konfigurations- und Analyseklassenbeschreibung des Frühlings
SpringMVC Interceptor implementiert einzelne Anmelde
Java -Programmierungsimplementierung von SpringMVC Simple Login Beispiel
Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!