Es gibt viele Java -Anfänger, die nicht viel über MyBatis Interceptor Intenzeptor wissen. Hier werde ich den nächsten Artikel für Sie organisieren, um den MyBatis Interceptor InteCeptor in Java zu erklären.
Dieser Artikel analysiert hauptsächlich den Plug-in-Mechanismus von MyBatis, der tatsächlich in der Implementierung von Java Dynamic Proxy in der Verantwortung der Kettenmodelle liegt.
Nach offiziellen Dokumentation. MyBatis ermöglicht nur die Abfangen der folgenden Methoden, die die Signaturparameter der Interceptor -Annotation bestimmt.
Der Code ist wie folgt
Executor (Update, Abfrage, Spuschstatements, Commit, Rollback, GetTransaction, Close, isclose) ParameterHandler (GetParameterObject, SetParameters) Results, (Handleresultsets, HandleOutputParameters) AnweisungSattler (vorbereiten, parameterisieren, stapeln, aktualisieren, abfragen)
Der Quellcode der Interceptor -Verarbeitung lautet wie folgt, wo InterceptorChain.pluginall (..) ein benutzerdefiniertes Interceptor -Weben ist:
Der Code ist wie folgt
/ * Methode in org.apache.ibatis.Session.configuration class class /* Intercept ParameterHandler*/ parameterHandler = (parameterHandler) interceptorChain.pluginall (ParameterHandler); return parameterHandler;}public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler, ResultHandler resultHandler, BoundSql boundSql) { ResultSetHandler resultSetHandler = new DefaultResultSetHandler(executor, mappedStatement, parameterHandler, ResultHandler, Boundsql, Rowbounds); /* Intercept ResultsThandler*/ resultStHandler = (resultStHandler) interceptorChain.pluginall (resultStHander); return resultSetHandler;}public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { StatementHandler statementHandler = new RoutingStatementHandler(executor, mappedStatement, parameterObject, rowBounds, resultHandler, bodensql); /* Intercept StatementHandler*/ StatementHandler = (StatementHandler) interceptorChain.pluginall (StatementHandler); return titiesHandler;} public Executor Neexecutor (Transaktionstransaktion, Executortype Executortype) {EXTROTORTYPE = EXTROTORTYPE == NULL? DefaultExecUTortype: ExecUTortype; EXTROTORTYP = EXTROTORTYP == NULL? ExecUTOrtype.Simple: Executortype; Testamentsvollstrecker; if (outortype.batch == Executortype) {executor = new batchexecutor (this, Transaktion); } else if (operortype.REUSE == ExecUtOrtype) {executor = new Reusexexecutor (this, Transaktion); } else {executor = new SimpleExecutor (this, Transaction); } if (cacheenabled) {executor = new CachingExecutor (Executor); } /* Intercept Executor* / Executor = (Executor) interceptorChain.pluginall (Executor); Ausführender zurückgeben;} Um einen benutzerdefinierten Interceptor zu implementieren, müssen Sie nur die Interceptor -Schnittstelle implementieren. Der allgemeine Code lautet wie folgt:
Der Code ist wie folgt
/* Die Methode und Parameter der Annotation, die angeben, welche Schnittstelle zu intercept*/ @intercepts ({@signature (type = StatementHandler.Class), method = "prepe", args = {connection.class})}) öffentliche Klasse YourInterceptor Implements Interceptor {public Object (Invocation "-Ruchanleitungen) Throwable CLASS {DOSOMETRAUS (). / * HINWEIS: Hier wird die Methode für den Aufruf. } / * Generieren Sie einen Proxy für das Zielziel, und die Annotation von @Intercepts wird in Plugin verwendet. } /* Verwendet, um benutzerdefinierte Interceptor -Konfigurationsparameter zu setzen Unter ihnen befindet sich der Code zum Abfangen von Anrufen in Plugin.wrap:
Der Code ist wie folgt
/* org.apache.ibatis.plugin.plugin class*/public class Plugin implementiert invocationHandler {/* den Code weglassen ...*/public static Object Wrap (Objektziel, Interceptor Interceptor) {/* Hier wird die Annotationssignatur des Interceptor*/map <class <? Klasse <?> Type = target.getClass (); /* Abrufen die Schnittstelle, die der Zielklasse entspricht if (interfaces.length> 0) { /* Verwenden Sie JDK Dynamic Proxy* / return proxy.newproxyinstance (type.getClassloader (), Schnittstellen, neues Plugin (Ziel, Interceptor, Signaturemap)); } return target; } /* Die Ausführung aller Methoden der Intercept -Zielklasse wird hier ausgeführt.* / @Override öffentliches Objekt Invoke (Object Proxy, Method -Methode, Object [] args) löst Throwable {try {set <Methode <Methoden> methodien = Signaturemap.get (methode.getdeclaringklass ()) aus; if (Methoden! = null && methods.contains (Methode)) { /* Führen Sie die Interceptor -Methode aus* / return Interceptor.Intercept (neuer Invocation (Ziel, Methode, Argumente)); } return methode.invoke (Ziel, args); } catch (Exception E) {throutsUtutil.unwrapthrowable (e); }} / * Den Code weglassen ... * /}Sie können sehen, dass der Kerncode von MyBatis Interceptor Design relativ einfach ist, aber flexibel genug ist. Achten Sie bei der Verwendung in der Praxis vorsichtig, um keinen bedeutungslosen Proxy (Plugin.Wrap) zu sein.