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.
<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>
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.
<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.
MethodInterface method = MethodProxyFactory.newInstance(MethodInterface.<span style="color: #0000ff">class</span><span style="color: #000000">); method.helloWorld();</span>
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!