Heim  >  Artikel  >  Java  >  [Übertragung] Einfaches Implementierungsprinzip der MyBatis-Schnittstelle

[Übertragung] Einfaches Implementierungsprinzip der MyBatis-Schnittstelle

PHP中文网
PHP中文网Original
2017-07-09 18:12:391303Durchsuche

Einfaches Implementierungsprinzip der MyBatis-Schnittstelle

Leute, die MyBatis3 verwendet haben, fragen sich vielleicht, warum die Mapper-Schnittstelle von MyBatis keine Implementierungsklasse hat, sie aber direkt verwendet werden kann?

Das liegt daran, dass MyBatis die vom Java Dynamic Proxy implementierte Schnittstelle verwendet.

Hier ist nur ein einfaches Beispiel, um das Prinzip zu veranschaulichen. Es ist nicht vollständig spezifisch für MyBatis. Wir können diese Idee auch auf andere Orte anwenden.

Definieren Sie eine Schnittstelle

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

Dynamische Proxy-Schnittstelle implementieren

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

Hier sprechen wir kurz über das Implementierungsprinzip von MyBatis für die Methode invoke. Bei dieser Methode können wir die Schnittstelle und den Methodennamen über Methode erhalten. Der vollständige Name der Schnittstelle entspricht namespace in MyBatis XML , und der Methodenname entspricht id in einer bestimmten Methode. Das heißt, nach der Übergabe des dynamischen Proxys können Sie mit SqlSession die entsprechende Methode über die Methode namespace.id aufrufen. Die Verwendung von Schnittstellen ist bequemer, allerdings auf indirekte Weise.

Dynamische Proxy-Factory-Klasse

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

Über diese Factory-Klasse können dynamische Proxy-Klassen für jede Schnittstelle generiert werden.

Testen

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

Zusammenfassung

Wenn es um dynamische Agenten geht, beschäftigen wir uns im Allgemeinen normalerweise mit Transaktionen, Protokollen oder der Aufzeichnung der Ausführungseffizienz von Methoden und anderen Anwendungen. Bei allen handelt es sich um eine spezielle Verarbeitung von Klassenmethoden vor oder nach der Implementierung.

In diesem Artikel können wir tatsächlich eine andere Anwendungsrichtung sehen, das heißt, es besteht keine Notwendigkeit, die Klasse zu implementieren, und die Schnittstellenmethode wird direkt über den dynamischen Proxy ausgeführt. MyBatis verwendet diese Methode, um uns dies zu erleichtern Mit dieser Idee können wir vielleicht in anderen Aspekten bessere Designs erstellen.

Originaltext:

Das obige ist der detaillierte Inhalt von[Übertragung] Einfaches Implementierungsprinzip der MyBatis-Schnittstelle. 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