Dieser Artikel stellt hauptsächlich die Java-Reflexion zur Implementierung des Aop-Proxys vor. Folgen wir dem Editor und werfen wir einen Blick darauf.
Verwenden Sie Reflection, um den dynamischen Proxy von JDK zu generieren, der der AOP-Proxy in AOP ist, und ersetzen Sie das Ziel--Objekt , wodurch Verbesserungen in den Code eingebunden werden .
Definieren Sie die Proxy-Schnittstelle
Da der dynamische JDKf-Proxy nur dynamische Proxys für Schnittstellen erstellen kann, gehen wir davon aus, dass wir zuerst die Transaktionsverarbeitung hinzufügen müssen Speichermethode der Daten. Wir haben eine UserDao-Schnittstelle, die über eine Speichermethode verfügt. Der Code lautet wie folgt:
public interface UserDao { public void save(); }
Definieren Sie die Proxy-Instanz
Das Folgende ist die spezifische Implementierung der durch die Schnittstelle definierten Methode. Zur Implementierung verwenden wir den folgenden Code.
public class UserDaoImpl implements UserDao { @Override public void save() { System.out.println("I am save user...."); } }
Erweiterungscode definieren
Wir haben die folgenden Vorgänge: Öffnen Sie die Transaktion, bevor Sie den Benutzer speichern, übernehmen Sie die Transaktion, nachdem Sie den Benutzer gespeichert haben, und Definieren Sie im Erweiterungscode zwei Methoden before() und after(), die vor und nach dem Start der Ausführung der save()-Methode verwendet werden.
public class UserTx { public void before(){ System.out.println("before save....."); } public void after(){ System.out.println("after save......"); } }
Invocation-Handler definieren
Der Grund, warum der Handler definiert wird, liegt darin, dass bei der Ausführung eines dynamischen Proxys die invoke()-Methode im Handler verwendet wird wird tatsächlich ausgeführt. In diesem Fall passen wir den Inhalt der Methode in der invoke()-Methode an und erzielen so die Logik und die Wirkung von Proxy und Erweiterung.
public class UserDaoInvocationHandler implements InvocationHandler { / 需要代理的对象 / private Object proxyObj; / 指定我们需要代理的对象 @param proxyObj */ public void setProxyObj(Object proxyObj) { this.proxyObj = proxyObj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { UserTx tx = new UserTx(); tx.before(); Object resultObj = method.invoke(proxyObj, args); tx.after(); return resultObj; } }
Testergebnisse
Alles wurde oben definiert. Wir werden das von uns angegebene Objekt tatsächlich dynamisch vertreten und das Proxy-Objekt verwenden. Führen wir die Methode aus Wir möchten den Proxy ausführen und überprüfen, ob er erfolgreich ist.
import java.lang.reflect.Proxy; public class ProxyTst { public static void main(String[] args) { // proxy object UserDao target = new UserDaoImpl(); // invocation handler UserDaoInvocationHandler handler = new UserDaoInvocationHandler(); handler.setProxyObj(target); // proxy UserDao targeted = (UserDao) Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler); // execute proxyed object targeted.save(); } }
Nachdem wir den obigen Code ausgeführt haben, können wir die folgende Ausgabe auf der Konsole sehen, die beweist, dass UserDao erfolgreich weitergeleitet wurde und wir unserem Programm auch erfolgreich Transaktionsfunktionen hinzugefügt haben.
before save..... I am save user.... after save......
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Codefälle für die Java-Reflektion zur Implementierung des Aop-Proxys. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!