1. مقدمة
أثناء عملية التطوير ، غالبًا ما نحتاج إلى كتابة العديد من الأمثلة:
essmapping ("/id/get") النتيجة العامة getByid (معرف السلسلة) يلقي استثناء {log.info ("المعلمة طلب هي:"+id) ؛ تحقق (جديد VERIFYPARAM ("معرف القسم" ، معرف)) ؛ نتيجة النتيجة = نتيجة جديدة ("تم الحصول عليها بنجاح من خلال ID!" ، service.querybyid (id)) ؛ log.info ("رسالة الإرجاع هي:"+result.toString ()) ؛ نتيجة العودة }طباعة معلمات طلب ومعلمات الإرجاع ، وهذه العمليات موجودة في كل طريقة ، مما يجعل الكود لدينا أكثر زائدة عن الحاجة. لهذا السبب ، يمكننا استخدام الوكيل الديناميكي لاستخدام معلمات الطباعة وطباعة رسائل الإرجاع كأقسام ، واستخدام تعبيرات نقاط لقطعها في كل طريقة.
2. الخطوات
1. إدخال التبعيات المتعلقة بـ AOP:
<!-التبعيات المتعلقة بـ AOP-> <Rependency> <roupiD> org.springframework.boot </groupId> <StifactId> Spring-Boot-Starter-Aop </stifactid> </redenced>
بعد إدخال التبعيات ، سوف يقوم Spring-Aop بتحميل التبعيات التي يحتاجها. يستخدم SPRING SABNEJ افتراضيًا لتنفيذ الإخطارات.
من بينها ، يحتوي SideJweaver.jar على ملفات تحلل تعبيرات نقاط SideJ. هذا التبعية مطلوب أيضًا عند استخدام تعبيرات نقاط للتعامل مع المعاملات.
2. التكوين:
1) إنشاء فئة التكوين:
/*** @Function الوصف: فئة AOP المستخدمة في عمليات طبقة التحكم* Author Administrator*/ @component // معالجة الكائنات إلى الربيع من أجل management aspect // تمثل هذه الفئة كتحكم في فئة الجانب {}يمثل التعليق التوضيحي ASPECT أنه فئة إدارة الجوانب ، حيث يمكن تعريف تعبيرات نقاط النقطة ، وسيقوم إطار العمل الجانبي بتحليلها.
2) تحديد تعبير نقطة:
@pointcut ("التنفيذ (public*com.hzt.manage.*.حيث يمثل @pointcut هذه الطريقة كتعبير مقطوع النقطة. قيمتها تعبير نقاط ، حيث يمكن حذف القيمة وتنسيقها القاسي:
annotation (تنسيق علامة التعبير + التعبير)
بالنسبة للتنسيق ، فإن مؤشرات نقاط النقطة الجانبية التي تدعمها الربيع AOP هي كما يلي:
1. التنفيذ: نقطة الاتصال المستخدمة لمطابقة تنفيذ الطريقة ؛
2. داخل: تستخدم لمطابقة تنفيذ الطرق داخل النوع المحدد ؛
3. هذا: طريقة التنفيذ المستخدمة لمطابقة نوع كائن الوكيل AOP الحالي ؛ لاحظ أن نوع مطابقة كائن وكيل AOP ، والذي قد يتضمن إدخال واجهات ومطابقة النوع ؛
4. الهدف: طريقة التنفيذ المستخدمة لمطابقة نوع الكائن الهدف الحالي ؛ لاحظ أن مطابقة النوع للكائن الهدف هو مطابقة النوع ، بحيث لا يتم تضمين إدخال الواجهة ؛
5. args: يتم استخدام طريقة التنفيذ لمطابقة المعلمات التي تم تمريرها بواسطة الطريقة التي تم تنفيذها حاليًا كنوع محدد ؛
6.
7. Target: طريقة التنفيذ المستخدمة لمطابقة نوع الكائن الهدف الحالي ، حيث يحتفظ الكائن الهدف بالشروح المحدد ؛
8. ARGS: تستخدم لمطابقة تنفيذ المعلمات التي تم تمريرها في الطريقة التي تم تنفيذها حاليًا والتي تحمل التعليق التوضيحي المحدد ؛
9.
10. الفول: تمديد الربيع AOP ، لا يوجد لدى SideBJ طريقة تنفيذ لمطابقة كائنات الفاصوليا باسم معين ؛
11. نقطة مرجعية: تعني الإشارة إلى نقاط دخول التسمية الأخرى ، فقط appectj نمط يدعمه ، ولكن ليس نمط المخطط.
يحدد ARGS المعلمات عند تنفيذ طريقة التعبير المقطوعة:
@pointcut (value = "التنفيذ (public*com.hzt.manage.*. Web.Controller ..*.*.
نحن نركز على التعبير عن نقطة اتصال طريقة التنفيذ ، وهيكلها القاسي هو:
التنفيذ (Modifiers-Pattern؟ Ret-type-type-type-type-type؟ name-pattern (param-pattern) remith-pattern؟)
1. مطابقة المعدل (النمط المعدل؟) (يمكن حذفها)
2. يمكن أن تمثل مطابقة قيمة الإرجاع (Ret-type-pattern) أي قيمة إرجاع لـ *، مثل (السلسلة) تمثل فقط تصفية نقطة الإدخال التي تُرجع نوع السلسلة ، وأسماء الفصول الدراسية للمسار الكامل ، وما إلى ذلك (لا يمكن حذفها)
3. إعلان النمط؟ على سبيل المثال ، يمثل *. Manage الحزمة من المستوى الأول على أنها حزمة التعسفية والثانية كاسم للإدارة. *.. إدارة تمثل حزم الفئة الفرعية تحت جميع الحزم إدارة. com .. *. comtroller يمثل جميع حزم وحدة التحكم تحت حزم com ، وما إلى ذلك ، و * يعني أن جميع الحزم تتطابق. (لم يتم حذفه)
4. يمكن لمطابقة اسم الطريقة (النمط الاسم) تحديد اسم الطريقة أو * يمثل كل شيء ، ويمثل * جميع الطرق التي تبدأ بـ GET ، أو يمكنك تحديد البادئة * الحصول على أي طريقة مع لاحقة تعسفية لـ GET (لم يتم حذفها)
5. يمكن لمطابقة المعلمة ((param-pattern)) تحديد نوع معلمة محدد ، يتم فصل المعلمات المتعددة بواسطة "، ويمكن أيضًا أن تكون كل معلمة"*"لمطابقة أي نوع من المعلمات ، مثل (السلسلة) تعني طريقة لمطابقة معلمة السلسلة ؛ (*، السلسلة) تعني طريقة لمطابقة معلمتين ، يمكن أن تكون المعلمة الأولى من أي نوع ، والمعلمة الثانية من نوع السلسلة ؛ (..) يمكن استخدامها لتمثيل أي معلمة (لم يتم حذفها)
6. مطابقة نوع الاستثناء (رميات النمط؟)
3. تحديد طريقة الوجه
around ("extilege ()") كائن عام حول (proseingJoinPoint PJD) يلقي رمي {// الحصول على اسم الأسلوب className = pjd.getSignature (). getClass (). getName () ؛ // احصل على اسم طريقة التنفيذ سلسلة methodName = pjd.getSignature (). getName () ؛ / ** طباعة سجل التهيئة*/ logger log = loggerfactory.getLogger (className) ؛ // تحديد نتيجة كائن المعلمة الإرجاع = فارغة ؛ // سجل وقت البدء الطويل = System.CurrentTimeMillis () ؛ // GET METHOND PARAMETers Object [] args = pjd.getargs () ؛ String params = "معلمات الطلب الأمامي هي:" ؛ // احصل على مجموعة معلمة الطلب وتجارة ويلصق لـ (كائن كائن: args) {params + = object.toString () + "،" ؛ } params = params.subString (0 ، params.length () - 1) ؛ // اطبع معلمة المعلمة request log.info (className + "class" + methodName + "" + params) ؛ // تنفيذ نتيجة طريقة الهدف = pjd.proceed () ؛ // اطبع لرسالة الإرجاع log.info ("الطريقة تُرجع الرسالة على النحو التالي:" + (نتائج مثيل النتائج؟ (النتيجة) النتيجة: النتيجة)) ؛ // احصل على سجل وقت التنفيذ. نتيجة العودة }5. الإخطار المحيط @AROUND ، كما هو موضح في الكود أعلاه ، هو إشعار محيط ، والذي يحتوي
حيث pjd.proceed () ؛ تمثل الطريقة تنفيذ الطريقة الهدف والحصول على قيمة إرجاع لنوع الكائن. يمكننا معالجة قيمة الإرجاع ، مثل معالجة الديكور ، إلخ.
قيمة الإرجاع هي نتيجة تنفيذ الطريقة. في الكود أعلاه ، يحصل أولاً على اسم الفئة ، واسم الأسلوب ، ومعلمات طلب الطريقة ، وما إلى ذلك ، يقوم بطباعة الربط ، ويسجل وقت بدء تنفيذ الطريقة ، ويطبعه إلى السجل.
ثم قم بتنفيذ الطريقة ، والحصول على نتيجة إرجاع الطريقة ، وطباعة وقت التنفيذ ونتيجة التنفيذ.
أخيرًا ، يتم إرجاع نتيجة التنفيذ. وهذا يعني أن قسم AOP ترميز رسالة الطلب وإكمال رسالة الإرجاع.
حيث يمثل @AROUND كوسيلة إشعار محيط ، فإنه يحتوي على الأنواع التالية:
1. before قبل التعويض ، والذي يحتوي على معلمة request JoinPoint ، والتي يتم استخدامها لتوصيل تفاصيل اتصال نقطة الاتصال الحالية ، بما في ذلك اسم الطريقة وقيمة المعلمة بشكل عام. يتم تنفيذ هيئة الطريقة قبل تنفيذ الطريقة ، ولا يمكن تغيير معلمات الطريقة ، ولا يمكن تغيير نتائج تنفيذ الطريقة.
before (value = "الامتياز ()") باطل عام قبل (JoinPoint JoinPoint) {}2. بعد الإخطار بعد الإخطار: الإخطار بأن التنفيذ يتم تنفيذها بغض النظر عما إذا كان هناك استثناء يحدث بعد تنفيذ الطريقة المستهدفة. في مرحلة ما بعد التقييم ، لا يمكن الوصول إلى نتيجة تنفيذ الطريقة المستهدفة (لأنه قد يحدث استثناء) ، ولا يمكن تغيير نتيجة التنفيذ للطريقة.
before (value = "الامتياز ()") void public بعد (JoinPoint JoinPoint) {}3. @AfterReturning يعيد إشعارًا. الإشعار الذي يتم تنفيذه إلا عند تنفيذ الطريقة المستهدفة هو نفس الطريقة التي تم ترتيبها. يمكنه الوصول إلى نتيجة تنفيذ الطريقة (بسبب التنفيذ الطبيعي) وتفاصيل اتصال الطريقة ، ولكن لا يمكن تغيير نتيجة تنفيذ الطريقة.
apterReturning (value = "evenilege ()") public void efternerning (JoinPoint JoinPoint ، نتيجة الكائن) {}قيمة الإرجاع المخزنة في النتيجة هي الطريقة.
4. AfterThrowing استثناء إشعار: رمز سيتم تنفيذه فقط عندما يحدث استثناء في طريقة الهدف. تمثل سمة الرمي استثناءًا يتم إلقاؤه أثناء تنفيذ هيكل الطريقة ، ويجب أن تكون قيمتها متسقة مع قيمة الاستثناء في الطريقة.
AfterThrowring (value = "faceilege ()" ، rehrowing = "ex") public void تجاوز (JoinPoint JoinPoint ، استثناء EX) {}3. اختبار
اكتب طريقة وحدة تحكم
@restController@requestMapping ("/API/V1/DEPT") يمتد DeptController الفئة العامة {/** فئة التسجيل*/logger private = loggerfactory.getLogger (getClass ()) ؛ / ** خدمتي الخاصة*/ خدمة خدمة DeptService الخاصة ؛ /*** function الوصف: طريقة لاستعلام محتوى قسم الاستعلام استنادًا إلى المعرف* @DEPT DEPT*/getMapping ("/id/get") النتيجة العامة getById (معرف السلسلة) يلقي استثناء {VERIFY (New VERIFYPARAM ("معرف القسم" ، معرف)) ؛ إرجاع نتيجة جديدة ("تم الحصول عليها بنجاح من خلال ID!" ، service.querybyid (id)) ؛ }}وبهذه الطريقة ، فإن الطريقة في طبقة وحدة التحكم الخاصة بنا موجزة إلى حد كبير.
نتائج الاختبار:
2018-04-10 22: 59: 27.468 info 1460 --- [NIO-8088-EXEC-5]
2018-04-10 22: 59: 27.470 info 1460 --- [NIO-8088-EXEC-5] nproCeredingJoInPoint $ methodsignatureMpl: الطريقة التي تُرجع الرسالة كما: result [result_code = suc ، result_message = نجح في الحصول على معلومات القسم! CreateTime = Thu Apr 19 23:38:37 CST 2018 ، EditTime = NULL]]
2018-04-10 22: 59: 27.470 info 1460 --- [NIO-8088-EXEC-5]
يتيح لك ذلك طباعة معلمات الطلب ، ونتائج الإرجاع ، ووقت التنفيذ ، وما إلى ذلك مع الطباعة الأنيقة والموجزة والموجزة!