رد الاتصال واجهة
يستخدم المستمع بشكل أساسي آلية رد الاتصال لتنفيذ بعض التعليمات البرمجية الخاصة بنا قبل حدوث إجراء ما أو بعد ما. في لغة جافا ، يمكن استخدام واجهات.
تنفيذ قضية المستمع
للراحة ، حدد مباشرة في بيئة الربيع: خذ العمل كمثال لتحديد المستمع في البداية (أو في نهاية) العمل.
1. تحديد واجهة رد الاتصال
package com.yawn.demo.listener ؛/** * Author تم إنشاؤه بواسطة Yawn في 2018-01-21 13:53 */واجهة عامة WorkListener {void onStart (اسم السلسلة) ؛}2. حدد الإجراء
package com.yawn.demo.service ؛ import com.yawn.demo.listener.worklistener ؛/** * Author تم إنشاؤه بواسطة yawn في 2018-01-21 13:39 */ @servicepublic class myservice {resource private prophonservice ؛ مستمع قائمة العمل الخاصة ؛ public void setworklistener (WorkListener WorkListener) {this.listener = WorkListener ؛ } public void work (string name) {leader.onstart (name) ؛ propeonservice.work () ؛ }}عمل العمل هو طريقة محددة. في الوقت المناسب لطريقة العمل () ، تسمى الواجهة المحددة أعلاه. بالإضافة إلى ذلك ، في فئة تعريف الإجراء هذا ، من الضروري تحسين طريقة تعيين المستمع.
3. استمع إلى الاختبار
Runwith (SpringRunner.Class) springBOOTTESTPublic Class DemoSpringAntationApplicationTests {resource private myService myService ؛ test public void test1 () {// interface Settings Settings MyService.setWorkListener (new WorkListener () {Override public void onStart (string name) {system.out.println ("start work for" + name + "!) ؛ System.out.println ("ابدأ العمل لـ" + name + "!")) ؛ // work myservice.work ("Boss") ؛ } test public void test2 () {// erverit فئة التنفيذ لتعيين المستمع myservice.setworklistener (newWorkListener ()) ؛ // work myservice.work ("Boss") ؛ } class MyWorkListener يمتد worklisteneradaptor {Override public void onStart (اسم السلسلة) {system.out.println ("ابدأ العمل لـ" + name + "!") ؛ }}}باستخدام طريقتين أعلاه للاختبار ، تم الحصول على النتائج:
ابدأ العمل لرئيسه! العمل بجد ...
هذا يدل على أنه قبل حدوث عمل الإجراء ، يتم تنفيذ رمز الاستماع الذي كتبناه في فئة الاختبار لتحقيق الغرض من الاستماع إلى الفصل.
تنفيذ المستمع مع التعليقات التوضيحية
في الكود أعلاه ، تسمى استدعاء طريقة SetworkListener (مستمع WorkListener) بشكل عام المستمع Setting (Record) ، وهو تعيين رمز الاستماع الذي كتبته كمستمع إجراء. ومع ذلك ، في كل مرة تقوم فيها بتسجيل مستمع ، تحتاج عمومًا إلى كتابة فصل لتنفيذ واجهة محددة أو ورث الفئة التي تنفذ الواجهة ، ثم إعادة كتابة طريقة تعريف الواجهة. لذلك ، أراد المبرمجون الأذكياء تبسيط هذه العملية ، لذلك توصلوا إلى طريقة لاستخدام التعليقات التوضيحية. باستخدام التعليقات التوضيحية ، اكتب قطاع رمز الاستماع بطريقة ما ، واستخدم التعليق التوضيحي لتمييز هذه الطريقة.
في الواقع ، أصبح الاستخدام بسيطًا ، لكن التنفيذ ليس صحيحًا بالضرورة.
1. تحديد التعليق التوضيحي
package com.yawn.demo.anno ؛ target (elementType.method)@repinety
2. التعليقات التوضيحية التحليلية
package com.yawn.demo.anno ؛ استيراد com.yawn.demo.service.myservice ؛ استيراد org.springframework.beansexception ؛ استيراد org.springframework.beans.factory.initializingbean org.springframework.context.applicationContextAware ؛ استيراد org.springframework.stereotype.component ؛ import javax.annotation.resource ؛ import java.lang.annotation.annotation ؛ استيراد java.lang.reflect.method ؛ استيراد java.link.link.link. java.util.map ؛/** * Author التي تم إنشاؤها بواسطة Yawn في 2018-01-21 14:46 */ @ComponentPublic Class WorkListerenerparser تنفذ ApplicationContextAware ، initializingbean {resource myservice myservice ؛ application applicationcontext applicationContext ؛ Override public void بعد propertiesset () يلقي الاستثناء {map <string ، object> leaderBeans = getExpectListenerBeans (controller.class ، restController.class ، service.class ، component.class) ؛ لـ (مستمع الكائن: المستمعين. } myservice.setworklistener (name -> {try {method.invoke (المستمع ، الاسم) ؛} catch (استثناء e) {e.printstacktrace () ؛}}) ؛ }}}} / ** * ابحث عن الفاصوليا الممكنة استخدام التعليقات التوضيحية * param annotationTyTypes نوع شرح مستوى الفئة الذي يجب أن يتم مسحه ضوئيًا * return من الفاصوليا الممسوحة ضوئيًا * / map private <string ، object> getExpectistenerbeans (class <؟ LinkedHashMap <> () ؛ لـ (Class <؟ Extends annotation> annotationType: enrotationTypes) {map <string ، Object> enrotatedBeansMap = ApplicationContext.getBeanswithannotation (enoTationType) ؛ المستمعين. } إرجاع المستمع ؛ } Override public void setapplicationContext (ApplicationContext ApplicationContext) يلقي beansexception {this.applicationContext = ApplicationContext ؛ }}أثناء تحليل التعليقات التوضيحية ، قم بإعداد المستمع.
في فئة التحليل ، يتم تنفيذ Application ApplicationContextAware. من أجل الحصول على المرجع إلى ApplicationContext في الفصل ، يتم استخدامه للحصول على الفول في حاوية IOC ؛ ويتم تنفيذ تطبيق الواجهة التهيئة لتنفيذ مدونة التعليقات التوضيحية لتحليل المستمع في وقت مناسب. إذا لم تقم بذلك ، فيمكنك الاتصال بالرمز المستصيب والتعيين عند تنفيذ CommandLinerUnner ، ويمكن أيضًا حقن ApplicationContext تلقائيًا.
3. اختبار
بعد تنفيذ الكود أعلاه ، تم إعداد المستمع بالفعل ويمكن اختباره.
package com.yawn.demo.controller ؛ استيراد com.yawn.demo.anno.worklistener ؛ استيراد com.yawn.demo.service.myservice ؛ استيراد org.springframework.web.bind.annotation.getmapping javax.annotation.resource ؛/** * Author التي تم إنشاؤها بواسطة Yawn في 2018-01-21 13:28 */ @RestControllerPublic Class TestController {resource myservice myservice ؛ getMapping ("/work") الكائن العام work () {myService.work ("Boss") ؛ العودة "تم" ؛ } @worklistener public void الاستماع (اسم السلسلة) {system.out.println ("ابدأ العمل لـ" + name + "!") ؛ }}اكتب طريقة مراقبة ، ونوع المعلمة ورقمها هما نفس الواجهة ، ثم أضف التعليقات التوضيحية المخصصة. بعد بدء البيئة ، تم تعيين المستمع بالفعل.
ثم استدعاء طريقة العمل () من MyService عبر عنوان URL ويمكنك رؤية النتيجة:
ابدأ العمل لرئيسه! العمل بجد ...
تم استدعاء طريقة الاستماع. في التطوير التالي ، يمكنك استخدام هذا التعليق التوضيحي لتسجيل المستمع.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.