Maison >Java >javaDidacticiel >[Transfert] Principe de mise en œuvre simple de l'interface MyBatis

[Transfert] Principe de mise en œuvre simple de l'interface MyBatis

PHP中文网
PHP中文网original
2017-07-09 18:12:391325parcourir

Principe simple de mise en œuvre de l'interface MyBatis

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.

Définir une interface

<span style="color: #0000ff">public</span> <span style="color: #0000ff">interface</span> MethodInterface { String helloWorld(); }

Implémenter une interface proxy dynamique

<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.

Classe d'usine de proxy dynamique

<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.

Test

MethodInterface method = MethodProxyFactory.newInstance(MethodInterface.<span style="color: #0000ff">class</span><span style="color: #000000">);
method.helloWorld();</span>

Résumé

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!

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