هناك العديد من المبتدئين في Java الذين لا يعرفون الكثير عن MyBatis Interceptor Inteceptor. هنا سوف أقوم بتنظيم المقالة التالية لتشرح مستقبل MyBatis Interceptor في Java.
تحلل هذه المقالة بشكل أساسي آلية المكونات الخاصة بـ MyBatis ، والتي هي في الواقع تنفيذ نموذج سلسلة المسؤولية للوكيل الديناميكي Java.
وفقا للوثائق الرسمية. يسمح MyBatis فقط بالاعتراض على الطرق التالية ، والتي تحدد معلمات توقيع التعليق التوضيحي للاعتراض.
الرمز كما يلي
Executor (التحديث ، الاستعلام ، FlushStatements ، الالتزام ، التراجع ، getTransaction ، Close ، IsClose) المعلمة (getParameterObject ، setParameters) النتائج (معالجات ، handoutputparameters) (إعداد ، المعلمة ، الدفعة ، التحديث ، التحديث)).
الكود المصدري لمعالجة التقاطع هو كما يلي ، حيث interceptorchain.pluginall (..) هو نسج اعتراض مخصص:
الرمز كما يلي
/ * الطريقة في org.apache.ibatis.session.configuration class */public paramethandler newParameterHandler (mappedStatement MediStateMent ، parameterObject ، boundsql pontedsql) {paramethandler paramethandler = mappedStatement.getLang (). /* Intercept parametherandler*/ parameterHandler = (parameterHandler) interceptorchain.pluginall (parametherHandler) ؛ return parametherHandler ؛} النتائج العامة NewResultSethandler (Executor Executor ، MedpedStatement MedpedStatement ، Rowbounds Robounds ، parametherhandler paramethandler ، resulthandler resulthandler ، executor ، resulaterler ، resultlerdler. BODEDSQL ، ROWBOUNDS) ؛ /* اعتراض النتائج*/ resultsethandler = (Resultsethandler) interceptorchain.pluginall (Resultsethandler) ؛ Return Resultsethandler ؛} public itshandler newStateMentHandler (Executor Executor ، MedpedStatement MedpedStatement ، Object ParameterObject ، rowbounds rowbounds ، resulthandler resulthandler ، probedsql) الحدود) ؛ /* intercept itshandler*/ itshandler = (stittleHandler) interceptorchain.pluginall (ittupleHandler) ؛ return stateHandler ؛} المنفذ العام newexecutor (معاملة المعاملات ، ExecutorType ExecutorType) {ExecutorType = ExecutorType == Null؟ DefaultExecutortype: ExecutorType ؛ ExecutorType = ExecutorType == NULL؟ ExecutorType.Simple: ExecutorType ؛ المنفذ if (executorType.Batch == ExecutorType) {executor = new batchexecutor (هذا ، المعاملة) ؛ } آخر إذا (executorType.reuse == ExecutorType) {Executor = new reuseexecutor (هذا ، المعاملة) ؛ } آخر {executor = new SimpleExecutor (هذا ، المعاملة) ؛ } if (cacheenabled) {executor = new CachingExecutor (Executor) ؛ } /* Intercept Executor* / executor = (Executor) interceptorChain.pluginall (executor) ؛ إرجاع المنفذ ؛} لتنفيذ اعتراض مخصص ، تحتاج فقط إلى تنفيذ واجهة التقاطع. الرمز العام كما يلي:
الرمز كما يلي
/* طريقة ومعلمات التعليقات التوضيحية التي تشير إلى واجهة لاعتراض*/ @intercepts ({signature (type = stitplehandler.class ، method = "إعداد" ، args = {connection.class})}) فئة yournittured الخاصة بك. ) } / * قم بإنشاء وكيل إلى الهدف الهدف ، ويتم استخدام شرح intercepts في البرنامج المساعد } /* المستخدمة لتعيين معلمات تكوين التقاطع المخصص* / Override public void setProperties (خصائص خصائص) {}} من بينها ، رمز اعتراض المكالمات هو في البرنامج المساعد.
الرمز كما يلي
/* org.apache.ibatis.plugin.plugin class*/Public Class Plugin تنفذ invocationHandler {/* حذف الكود ...*/ملف الكائن الثابت العام (هدف الكائن ، اعتراض المعتقل) {/* هنا هو الحصول على توقيع التعليقات للاعتراض*/MAP <؟> ، set <tealuped = getTatureMAP = class <؟> type = target.getClass () ؛ /* احصل على الواجهة التي تطابق الفئة الهدف*/ class <؟> [] واجهات = getAllInterfaces (النوع ، signaturemap) ؛ if (interfaces.length> 0) { /* استخدم JDK Dynamic Proxy* / return proxy.newproxyinstance (type.getClassLoader () ، واجهات ، مكون إضافي جديد (الهدف ، interceptor ، signaturemap)) ؛ } الهدف الإرجاع ؛ } /* سيتم تنفيذ تنفيذ جميع طرق الفئة الهدف التقاطع هنا* / Override الكائن العام الاستدعاء (وكيل الكائن ، طريقة الطريقة ، الكائن [] args) رمي {try {set <method> methods = signaturemap.get (method.getDeclaringClass ()) ؛ if (methods! = null && methods.contains (method)) { /* تنفيذ طريقة الاعتراض* / return interceptor.Intercept (استدعاء جديد (الهدف ، الطريقة ، args)) ؛ } method.invoke (الهدف ، args) ؛ } catch (استثناء e) {throw inspectoututil.unwrapthrowable (e) ؛ }} / * حذف الكود ... * /}يمكنك أن ترى أن الكود الأساسي لتصميم اعتراض MyBatis بسيط نسبيًا ، لكنه مرن بدرجة كافية. عند استخدامه في الممارسة العملية ، احرص على ألا تكون وكيلًا بلا معنى (البرنامج المساعد.