Heim >Java >javaLernprogramm >Detaillierte Erläuterung der Codefälle für die Java-Reflektion zur Implementierung des Aop-Proxys

Detaillierte Erläuterung der Codefälle für die Java-Reflektion zur Implementierung des Aop-Proxys

黄舟
黄舟Original
2017-03-27 10:39:391402Durchsuche

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn