Maison  >  Article  >  Java  >  Explication détaillée des cas de code pour la réflexion Java pour implémenter le proxy Aop

Explication détaillée des cas de code pour la réflexion Java pour implémenter le proxy Aop

黄舟
黄舟original
2017-03-27 10:39:391380parcourir

Cet article présente principalement la réflexion Java pour implémenter le proxy Aop. L'éditeur pense que c'est plutôt bien. Maintenant, je vais le partager avec vous et le donner comme référence. Suivons l'éditeur et jetons un coup d'œil.

Utilisez la réflexion pour générer le proxy dynamique du JDK, qui est le proxy AOP dans AOP, remplaçant l'objet cible , intégrant ainsi des améliorations dans le code. .

Définir l'interface du proxy

Étant donné que le proxy dynamique JDKf ne peut créer que des proxys dynamiques pour les interfaces, définissez d'abord l'interface. Supposons que nous devions ajouter le traitement des transactions au. Méthode de sauvegarde des données. Nous avons une interface UserDao, qui a une méthode Save. Le code est le suivant :

public interface UserDao {
  public void save();
}

Définir l'instance proxy

<.>Ce qui suit est l'implémentation spécifique de Save définie par la méthode, nous utilisons le code suivant pour l'implémenter.

public class UserDaoImpl implements UserDao {

  @Override
  public void save() {
    System.out.println("I am save user....");
  }

}

Définir le code d'amélioration

Nous avons les opérations suivantes, ouvrir la transaction avant d'enregistrer l'utilisateur, valider la transaction après avoir enregistré l'utilisateur, et dans le code d'amélioration Définissez deux méthodes before() et after(), qui sont utilisées avant et après le démarrage de l'exécution de la méthode save().

public class UserTx {
  public void before(){
    System.out.println("before save.....");
  }
  public void after(){
    System.out.println("after save......");
  }
}

Définir le gestionnaire d'invocation

La raison pour laquelle le gestionnaire est défini est que lorsqu'un proxy dynamique est exécuté, la méthode Invocation() dans le gestionnaire est réellement exécuté, dans ce cas, nous personnalisons le contenu de la méthode dans la méthode Invocation(), obtenant ainsi la logique et les effets du proxy et de l'amélioration.

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;
  }
}

Résultats des tests

Tout a été défini ci-dessus, nous allons en fait proxy dynamiquement l'objet que nous avons spécifié et utiliser l'objet proxy Exécutons la méthode nous voulons exécuter et vérifier si le proxy réussit.

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();
  }
}
Après avoir exécuté le code ci-dessus, nous pouvons voir la sortie suivante sur la console, prouvant que UserDao a été mandaté avec succès et que nous avons également ajouté avec succès des fonctions de transaction à notre programme.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn