Les personnes qui ont utilisé MyBatis3 peuvent se demander pourquoi l'interface Mapper de MyBatis n'a pas de classe d'implémentation, mais elle peut être utilisée directement ?
C'est parce que MyBatis utilise l'interface implémentée par le proxy dynamique Java.
Voici juste un exemple simple pour illustrer le principe. Il n'est pas tout à fait spécifique à MyBatis. On peut également appliquer cette idée à d'autres endroits.
<span style="color: #0000ff">public</span> <span style="color: #0000ff">interface</span> MethodInterface { String helloWorld(); }
<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> MethodProxy<T> <span style="color: #0000ff">implements</span><span style="color: #000000"> InvocationHandler { </span><span style="color: #0000ff">private</span> Class<T><span style="color: #000000"> methodInterface; </span><span style="color: #0000ff">public</span> MethodProxy(Class<T><span style="color: #000000"> methodInterface) { </span><span style="color: #0000ff">this</span>.methodInterface =<span style="color: #000000"> methodInterface; } @Override </span><span style="color: #0000ff">public</span> Object invoke(Object proxy, Method method, Object[] args) <span style="color: #0000ff">throws</span><span style="color: #000000"> Throwable { System.out.println(</span>"========================="<span style="color: #000000">); System.out.println(</span>"方法名:" +<span style="color: #000000"> method.getName()); </span><span style="color: #008000">//</span><span style="color: #008000">针对不同的方法进行不同的操作</span> <span style="color: #0000ff">return</span> <span style="color: #0000ff">null</span><span style="color: #000000">; } }</span>
Nous parlons brièvement ici du principe d'implémentation de MyBatis pour la méthode invoke
Dans cette méthode, nous pouvons obtenir l'interface et le nom de la méthode via Méthode. Le nom complet de l'interface est équivalent à namespace
dans MyBatis XML. , et le nom de la méthode est équivalent à id
dans une méthode spécifique. C'est-à-dire qu'après avoir passé le proxy dynamique, vous pouvez utiliser SqlSession
pour appeler la méthode correspondante via la méthode namespace.id
. L'utilisation des interfaces est plus pratique, mais de manière indirecte.
<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span><span style="color: #000000"> MethodProxyFactory { </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <T> T newInstance(Class<T><span style="color: #000000"> methodInterface) { </span><span style="color: #0000ff">final</span> MethodProxy<T> methodProxy = <span style="color: #0000ff">new</span> MethodProxy<T><span style="color: #000000">(methodInterface); </span><span style="color: #0000ff">return</span><span style="color: #000000"> (T) Proxy.newProxyInstance( Thread.currentThread().getContextClassLoader(), </span><span style="color: #0000ff">new</span><span style="color: #000000"> Class[]{methodInterface}, methodProxy); } }</span>
Des classes proxy dynamiques pour n'importe quelle interface peuvent être générées via cette classe d'usine.
MethodInterface method = MethodProxyFactory.newInstance(MethodInterface.<span style="color: #0000ff">class</span><span style="color: #000000">); method.helloWorld();</span>
De manière générale, lorsqu'il s'agit d'agents dynamiques, notre utilisation habituelle est de gérer les transactions, les journaux ou l'efficacité d'exécution des méthodes d'enregistrement et d'autres applications. Il s'agit tous de traitements spéciaux de méthodes de classe pré- ou post-implémentation.
Grâce à cet article, nous pouvons en fait voir une autre direction d'application, c'est-à-dire qu'il n'est pas nécessaire d'implémenter la classe, et la méthode d'interface est exécutée directement via le proxy dynamique. MyBatis utilise cette méthode pour nous faciliter la tâche. Appelons la méthode. En utilisant cette idée, nous pouvons peut-être créer de meilleures conceptions sous d'autres aspects.
Texte original :
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!