การโทรกลับ
ผู้ฟังใช้กลไกการโทรกลับเพื่อเรียกใช้รหัสบางส่วนของเราก่อนหรือหลังการกระทำเกิดขึ้น ในภาษา Java สามารถใช้อินเทอร์เฟซได้
ใช้เคสผู้ฟัง
เพื่อความสะดวกให้กำหนดโดยตรงในสภาพแวดล้อมฤดูใบไม้ผลิ: ใช้งานเป็นตัวอย่างเพื่อกำหนดผู้ฟังที่จุดเริ่มต้น (หรือในตอนท้าย) ของงาน
1. กำหนดอินเทอร์เฟซสำหรับการโทรกลับ
แพ็คเกจ com.yawn.demo.listener;/** * @author สร้างโดย Yawn เมื่อปี 2018-01-21 13:53 */Interface Public Interface WorkListener {เป็นโมฆะ onstart (ชื่อสตริง);}2. กำหนดการกระทำ
แพ็คเกจ com.yawn.demo.service; นำเข้า com.yawn.demo.listener.workListener;/** * @author สร้างโดย Yawn เมื่อปี 2018-01-21 13:39 */ @servicepublic คลาส myservice {@resource บุคคลส่วนตัว ผู้ฟังที่ทำงานส่วนตัว; โมฆะสาธารณะ setWorkListener (WorkListener WorkListener) {this.listener = WorkListener; } งานโมฆะสาธารณะ (ชื่อสตริง) {listener.onstart (ชื่อ); Personservice.work (); -การทำงานเป็นวิธีเฉพาะ ในเวลาที่เหมาะสมของวิธีการทำงาน () อินเทอร์เฟซที่กำหนดไว้ข้างต้นเรียกว่า นอกจากนี้ในคลาสนิยามการดำเนินการนี้จำเป็นต้องปรับปรุงวิธีการตั้งค่าผู้ฟัง
3. ฟังการทดสอบ
@runwith (SpringRunner.class) @springboottestpublic คลาส DemospringannotationApplicationTests {@Resource ส่วนตัว MyService MyService; @Test โมฆะสาธารณะ test1 () {// การตั้งค่าอินเตอร์เฟสฟัง MyService.SetWorkListener (ใหม่ WorkListener () {@Override โมฆะสาธารณะ onstart (ชื่อสตริง) {system.out.println ("เริ่มต้นใช้งาน" ชื่อ + "!");}}; System.out.println ("เริ่มงานสำหรับ" + name + "!")); // work myservice.work ("Boss"); } @Test โมฆะสาธารณะ test2 () {// สืบทอดคลาสการใช้งานเพื่อตั้งค่าผู้ฟัง myService.SetWorkListener (ใหม่ myworkListener ()); // work myservice.work ("Boss"); } คลาส MyWorkListener ขยาย WorkListenerAdaptor {@Override โมฆะสาธารณะ onstart (ชื่อสตริง) {system.out.println ("เริ่มงานสำหรับ" + name + "!"); -ใช้สองวิธีข้างต้นเพื่อทดสอบผลลัพธ์ที่ได้รับ:
เริ่มทำงานให้กับเจ้านาย! ทำงานหนัก ...
สิ่งนี้แสดงให้เห็นว่าก่อนที่งานแอ็คชั่นจะเกิดขึ้นรหัสการฟังที่เราเขียนในคลาสทดสอบจะถูกดำเนินการเพื่อให้บรรลุวัตถุประสงค์ของการฟังในชั้นเรียน
การใช้ผู้ฟังด้วยคำอธิบายประกอบ
ในรหัสด้านบนการเรียกใช้วิธีการ setWorkListener (ผู้ฟัง WorkListener) โดยทั่วไปเรียกว่าการตั้งค่า (ลงทะเบียน) ผู้ฟังซึ่งคือการตั้งค่ารหัสการฟังที่คุณเขียนเป็นผู้ฟังการกระทำ อย่างไรก็ตามทุกครั้งที่คุณลงทะเบียนผู้ฟังคุณจะต้องเขียนคลาสเพื่อใช้อินเทอร์เฟซที่กำหนดหรือสืบทอดคลาสที่ใช้อินเทอร์เฟซแล้วเขียนวิธีการกำหนดอินเตอร์เฟสใหม่ ดังนั้นโปรแกรมเมอร์อัจฉริยะจึงต้องการทำให้กระบวนการนี้ง่ายขึ้นดังนั้นพวกเขาจึงหาวิธีใช้คำอธิบายประกอบ การใช้คำอธิบายประกอบเขียนเซ็กเมนต์การฟังในวิธีการและใช้คำอธิบายประกอบเพื่อทำเครื่องหมายวิธีนี้
อันที่จริงการใช้งานนั้นง่าย แต่การใช้งานไม่จำเป็นต้องเป็นจริง
1. กำหนดคำอธิบายประกอบ
แพ็คเกจ com.yawn.demo.anno; @target (ElementType.method) @retention (RetentionPolicy.runtime) Public @Interface WorkListener {}2. คำอธิบายประกอบการวิเคราะห์
แพ็คเกจ com.yawn.demo.anno; นำเข้า com.yawn.demo.service.myservice; นำเข้า org.springframework.beans.beansexception; นำเข้า org.springframework.beans.factory.initializingbean; org.springframework.context.applicationContextaware; นำเข้า org.springframework.stereotype.component; นำเข้า javax.annotation.resource; นำเข้า java.lang.annotation.annotation; java.util.map;/** * @author สร้างโดย Yawn เมื่อปี 2018-01-21 14:46 */ @ComponentPublic Class WorkListenerParser ใช้ ApplicationContextaware, InitializingBean {@Resource ส่วนตัว MyService MyService; ApplicationContext Private ApplicationContext; @Override โมฆะสาธารณะ AfterPropertIesset () พ่นข้อยกเว้น {แผนที่ <สตริงวัตถุ> ListenerBeans = getExpectListenerBeans (controller.class, restcontroller.class, service.class, component.class); สำหรับ (ผู้ฟังวัตถุ: ListenerBeans.values ()) {สำหรับ (วิธีการ: listener.getClass (). getDeclaredMethods ()) {ถ้า (! method.isannotationpresent (workListener.class)) {ดำเนินการต่อ; } myService.SetWorkListener (ชื่อ -> {ลอง {method.invoke (ผู้ฟัง, ชื่อ);} catch (Exception e) {E.printStackTrace ();}}); }}}} / ** * ค้นหาถั่วที่เป็นไปได้ที่จะใช้คำอธิบายประกอบ * @param AnnotationTypes ประเภทคำอธิบายประกอบระดับชั้นเรียนที่ต้องสแกน * @return แผนที่ของถั่วสแกน * / แผนที่ส่วนตัว LinkedHashMap <> (); สำหรับ (คลาส <? ขยายคำอธิบายประกอบ> AnnotationType: AnnotationTypes) {MAP <String, Object> AnnotatedBeansMap = ApplicationContext.getBeanswithannotation (AnnotationType); ListenerBeans.putall (AnnotatedBeansMap); } return ListenerBeans; } @Override โมฆะสาธารณะ setApplicationContext (ApplicationContext ApplicationContext) พ่น beansexception {this.applicationContext = ApplicationContext; -ในระหว่างการวิเคราะห์คำอธิบายประกอบให้ตั้งค่าผู้ฟัง
ในคลาสการแยกวิเคราะห์จะมีการใช้งานอินเตอร์เฟส ApplicationContextaware เพื่อให้ได้การอ้างอิงไปยัง ApplicationContext ในชั้นเรียนจะใช้เพื่อรับถั่วในคอนเทนเนอร์ IOC และการใช้งานอินเทอร์เฟซการเริ่มต้นเบียนจะถูกนำมาใช้เพื่อดำเนินการรหัสของคำอธิบายประกอบการแยกวิเคราะห์และการตั้งค่าผู้ฟังในเวลาที่เหมาะสม หากคุณไม่ทำเช่นนี้คุณสามารถเรียกรหัสแยกและตั้งค่าเมื่อดำเนินการ commandlinerunner และ applicationContext สามารถฉีดโดยอัตโนมัติ
3. ทดสอบ
หลังจากดำเนินการรหัสด้านบนผู้ฟังได้รับการตั้งค่าแล้วและสามารถทดสอบได้
แพ็คเกจ 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 คลาส testController {@Resource ส่วนตัว MyService MyService; @getMapping ("/work") งานสาธารณะงาน () {myservice.work ("บอส"); กลับ "เสร็จ"; } @WorkListener โมฆะสาธารณะฟัง (ชื่อสตริง) {system.out.println ("เริ่มงานสำหรับ" + ชื่อ + "!"); -เขียนวิธีการตรวจสอบประเภทและหมายเลขพารามิเตอร์เหมือนกับอินเทอร์เฟซจากนั้นเพิ่มคำอธิบายประกอบที่กำหนดเอง หลังจากเริ่มสภาพแวดล้อมผู้ฟังจะถูกตั้งค่าแล้ว
จากนั้นเรียกใช้วิธีการทำงานของ MyService ผ่าน URL และคุณสามารถดูผลลัพธ์:
เริ่มทำงานให้กับเจ้านาย! ทำงานหนัก ...
วิธีการฟังถูกเรียก ในการพัฒนาครั้งต่อไปคุณสามารถใช้คำอธิบายประกอบนี้เพื่อลงทะเบียนผู้ฟัง
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น