Ada banyak pemula Java yang tidak tahu banyak tentang Interceptor Mybatis Interceptor. Di sini saya akan mengatur artikel berikutnya untuk Anda menjelaskan inteseptor interceptor Mybatis di Java.
Artikel ini terutama menganalisis mekanisme plug-in mybatis, yang sebenarnya merupakan implementasi model rantai tanggung jawab dari proxy dinamis Java.
Menurut dokumentasi resmi. Mybatis hanya memungkinkan mencegat metode berikut, yang menentukan parameter tanda tangan dari anotasi interseptor.
Kodenya adalah sebagai berikut
Pelaksana (pembaruan, kueri, flushstatements, komit, rollback, getTransaction, tutup, isclose) ParameterHandler (getParameterObject, setParameters) hasilkan (persiapan, parameterisasi, pembaruan, query)
Kode sumber pemrosesan pencegat adalah sebagai berikut, di mana interceptorchain.pluginall (..) adalah tenun pencegat khusus:
Kodenya adalah sebagai berikut
/ * Metode di kelas org.apache.atisis.Session /* 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 hasilSethandler*/ hasilSethandler = (hasilSethandler) interceptorchain.pluginall (hasilSethandler); 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, BoundSQL); /* Pencegatan Pernyataan HiShandler*/ Pernyataan Handler = (Pernyataan Tulisan) IntercepTorChain.Pluginall (Pernyataan Tulisan); Return Pernyataan Handler;} Eksekutor Publik NewExecutor (Transaction Transaction, ExecutorType ExecutorType) {ExecutorType = ExecutorType == NULL? DefaultExecutorType: ExecutorType; ExecutorType = ExecutorType == NULL? Executortype.Simple: Executortype; Pelaksana pelaksana; if (executorpe.batch == executorType) {executor = new Batchexecutor (this, transaction); } else if (executorpe.reuse == executortype) {executor = baru reuseexecutor (this, transaction); } else {executor = new SimpleExecutor (this, transaction); } if (cacheenabled) {executor = new CachingExecutor (Executor); } /* Pencegatan Executor* / Executor = (Executor) IntercepTorChain.pluginall (Executor); mengembalikan pelaksana;} Untuk mengimplementasikan pencegat khusus, Anda hanya perlu mengimplementasikan antarmuka Interceptor. Kode umum adalah sebagai berikut:
Kodenya adalah sebagai berikut
/* The method and parameters of the annotation that indicate which interface to intercept*/@Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class }) }) public class YourInterceptor implements Interceptor{ public Object intercept(Invocation invocation) throws Throwable{ doSomeThing(); / * CATATAN: Di sini, metode AWHOCATION.PROCECED () sebenarnya digunakan untuk menyelesaikan panggilan traversal dari rantai interceptorchain (yaitu, untuk mengeksekusi semua metode intersepsi terdaftar dari interseptor), dan ke metode asli panggilan objek proxy akhir */ pengembalian doa.promed (); } / * Hasilkan proxy ke target target, dan anotasi @Interceps digunakan di plugin.wrap * / @Override Plugin Objek Publik (Target Objek) { / * Ketika kelas target dari Jenis Pernyataan, Kelas Target dibungkus dan tidak ada proxy yang tidak berarti: target target (target target dari pernyataan)? Target plugin.wrap, target (target plugin.wrap, target (target target (target plugin.wrap, target, target (target plugin.wrap, target, target (target plugin.wrap, target, target, target, target (target plugin.wraper. } /* Digunakan untuk mengatur parameter konfigurasi pencegat khusus* / @Override public void setProperties (properti properti) {}} Di antara mereka, kode untuk mencegat panggilan ada di plugin.wrap:
Kodenya adalah sebagai berikut
/* org.apache.atisis.plugin.plugin kelas*/Plugin kelas publik mengimplementasikan InvocationHandler {/* menghilangkan kode ...*/bungkus objek statis publik (target objek, interceptor interceptor) {/* di sini adalah untuk mendapatkan tanda anotasi dari interceptor*/peta <class <?>, set <Method> untuk mendapatkan tanda anotasi dari interceptor = class <?>, set <Method >> Kelas <?> Type = target.getClass (); /* Dapatkan antarmuka yang cocok dengan kelas target*/ kelas <?> [] Antarmuka = getAllInterfaces (type, SignatureMap); if (interfaces.length> 0) { /* Gunakan JDK Dynamic Proxy* / return proxy.newProxyInstance (type.getClassLoader (), antarmuka, plugin baru (target, interceptor, SignatureMap)); } return target; } /* Eksekusi semua metode kelas target intersep akan dieksekusi di sini* / @Override Objek publik Invoke (Proxy Objek, Metode Metode, Objek [] args) melempar Throwable {try {set <nethod> Method = SignatureMap.get (Method.getDeclaringClass ()); if (Method! = null && methods.contains (Metode)) { /* Jalankan metode interceptor* / return interceptor.Intercept (Invocation baru (target, metode, args)); } return method.invoke (target, args); } catch (exception e) {throw exceptionutil.unwrapthrowable (e); }} / * Hilangkan kode ... * /}Anda dapat melihat bahwa kode inti desain interceptor MyBatis relatif sederhana, tetapi cukup fleksibel. Saat menggunakannya dalam praktik, berhati -hatilah untuk tidak menjadi proxy yang tidak berarti (plugin.wrap).