Callback antarmuka
Pendengar pada dasarnya menggunakan mekanisme panggilan balik untuk menjalankan beberapa kode kita sendiri sebelum atau setelah tindakan terjadi. Dalam bahasa Java, antarmuka dapat digunakan.
Menerapkan kasus pendengar
Untuk kenyamanan, tentukan langsung di lingkungan musim semi: ambil pekerjaan sebagai contoh untuk mendefinisikan pendengar di awal (atau di akhir) pekerjaan.
1. Tentukan antarmuka untuk panggilan balik
Paket com.yawn.demo.listener;/** * @author Dibuat oleh Yawn pada 2018-01-21 13:53 */antarmuka publik workListener {void ontart (nama string);}2. Tentukan aksinya
Paket com.yawn.demo.service; import com.yawn.demo.listener.worklistener;/** * @author Dibuat oleh Yawn pada 2018-01-21 13:39 */ @ServicePublic Class MyService {@resource Private Personservice Personservice; Pendengar WorkListener pribadi; public void setWorkListener (worklistener worklistener) {this.listener = worklistener; } public void work (nama string) {listener.onstart (name); Personservice.work (); }}Pekerjaan tindakan adalah metode khusus. Pada waktu yang tepat dari metode kerja (), antarmuka yang ditentukan di atas dipanggil. Selain itu, dalam kelas definisi tindakan ini, perlu untuk meningkatkan metode pengaturan pendengar.
3. Dengarkan Tes
@Runwith (springrunner.class) @springboottestpublic kelas demospringannotationApplicationTests {@resource private myService myService; @Test public void test1 () {// Pengaturan Antarmuka pendengar myservice.setworkListener (workListener baru () {@Override public void onStart (name string) {System.out.println ("Mulai bekerja untuk" + nama + "!");}}); // // Ekspresi Lambda Mysener/ MyService/ Myser. System.out.println ("Mulai bekerja untuk" + nama + "!")); // Bekerja MyService.Work ("Boss"); } @Test public void test2 () {// mewarisi kelas implementasi untuk mengatur pendengar myservice.setWorkListener (new myworklistener ()); // Bekerja MyService.Work ("Boss"); } class myWorkListener memperluas workListenerAdaptor {@Override public void onStart (string name) {System.out.println ("Mulai bekerja untuk" + name + "!"); }}}Menggunakan dua metode di atas untuk diuji, hasilnya diperoleh:
Mulailah bekerja untuk bos! Bekerja keras ...
Ini menunjukkan bahwa sebelum aksi terjadi, kode mendengarkan yang kami tulis di kelas tes dieksekusi untuk mencapai tujuan mendengarkan kelas.
Menerapkan pendengar dengan anotasi
Dalam kode di atas, memanggil metode SetWorkListener (WorkListener Listener) umumnya disebut Pengaturan (Daftar) pendengar, yaitu mengatur kode mendengarkan yang Anda tulis sebagai pendengar tindakan. Namun, setiap kali Anda mendaftarkan pendengar, Anda biasanya perlu menulis kelas untuk mengimplementasikan antarmuka yang ditentukan atau mewarisi kelas yang mengimplementasikan antarmuka, dan kemudian menulis ulang metode definisi antarmuka. Oleh karena itu, pemrogram pintar ingin menyederhanakan proses ini, sehingga mereka datang dengan cara untuk menggunakan anotasi. Menggunakan anotasi, tulis segmen kode mendengarkan dalam suatu metode, dan gunakan anotasi untuk menandai metode ini.
Memang, penggunaan telah menjadi sederhana, tetapi implementasi tidak selalu benar.
1. Tentukan anotasi
Paket com.yawn.demo.anno; @Target (elementType.method) @retention (retentionpolicy.runtime) public @interface workListener {}2. Anotasi analitik
Paket com.yawn.demo.anno; import com.yawn.demo.service.myservice; impor org.springframework.beans.beansException; impor org.springframework.beans.factory.initializeBean; impor org.springframework.context.pontext.appontext.appontext.applext org.springframework.context.applicationContextAware; impor org.springframework.stereotype.sponent; import javax.annotation.resource; impor java.lang.Annotation.Annotation; import java.lang.reflect.method; impor java.method Java.method; java.util.map;/** * @author Dibuat oleh Yawn pada 2018-01-21 14:46 */ @ComponentPublic Class WorkListenerParser mengimplementasikan ApplicationContextAware, InitializingBean {@Resource Private MyService MyService; Private ApplicationContext ApplicationContext; @Override public void afterpropertiesset () melempar Exception {MAP <String, Object> listenerbeans = getExpectListenerBeans (controller.class, restcontroller.class, service.class, component.class); untuk (Object Listener: listenerbeans.values ()) {for (metode metode: listener.getClass (). getDecLaredMethods ()) {if (! Method.ISANNOTationPresent (workListener.class)) {lanjutan; } myService.setWorkListener (name -> {try {Method.invoke (pendengar, name);} catch (Exception e) {e.printstacktrace ();}}); }}}} / ** * Temukan kacang yang dimungkinkan untuk menggunakan anotasi * @param annotationTypes Jenis anotasi tingkat kelas yang perlu dipindai * @return peta kacang yang dipindai * / peta pribadi <string, objek> getExpectListenBeans (class <? Extends annotation> ... annotationTypes) {peta / class <? Extends annotation> ... annotationTypes) {mapaphmer = Obybeed / Obyboed (class <? Extends Annotation> ... AnnotationTypes) {MAPOPED = MAPED = OPERBICED <? untuk (kelas <? Extends Annotation> AnnotationType: AnnotationTypes) {MAP <String, Object> AnnotatedBeansMap = ApplicationContext.getBeansWithanNotation (AnnotationType); listenerbeans.putall (annotatedBeansMap); } return listenerbeans; } @Override public void setApplicationContext (ApplicationContext ApplicationContext) melempar BeansException {this.applicationContext = ApplicationContext; }}Selama analisis anotasi, siapkan pendengar.
Di kelas parsing, antarmuka ApplicationContextAware diimplementasikan. Untuk mendapatkan referensi ke ApplicationContext di kelas, digunakan untuk mendapatkan kacang di wadah IOC; dan implementasi antarmuka InitializingBean diimplementasikan untuk menjalankan kode anotasi parsing dan mengatur pendengar pada waktu yang tepat. Jika Anda tidak melakukan ini, Anda dapat menghubungi kode parsed dan mengatur ketika CommandLinerNNER dieksekusi, dan ApplicationContext juga dapat disuntikkan secara otomatis.
3. Tes
Setelah menjalankan kode di atas, pendengar sudah diatur dan dapat diuji.
Paket com.yawn.demo.controller; import com.yawn.demo.anno.worklistener; import com.yawn.demo.service.myservice; import org.springframework.web.bind.annotation.getMapping; impor orgonconframework.bind.nnotation javax.annotation.resource;/** * @author Dibuat oleh Yawn pada 2018-01-21 13:28 */ @restcontrollerpublic kelas testController {@resource pribadi myService myService; @GetMapping ("/work") Publik Obyek Work () {MyService.Work ("Boss"); kembali "selesai"; } @WorkListener public void Listen (name string) {System.out.println ("Mulai bekerja untuk" + name + "!"); }}Tulis metode pemantauan, jenis dan angka parameter sama dengan antarmuka, dan kemudian tambahkan anotasi khusus. Setelah lingkungan dimulai, pendengar sudah ditetapkan.
Kemudian hubungi metode pekerjaan myService melalui URL dan Anda dapat melihat hasilnya:
Mulailah bekerja untuk bos! Bekerja keras ...
Metode mendengarkan telah dipanggil. Dalam pengembangan berikutnya, Anda dapat menggunakan anotasi ini untuk mendaftarkan pendengar.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.