亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

在spring中使用自定義注解注冊監聽器的方法

2024-07-13 10:17:09
字體:
來源:轉載
供稿:網友

接口回調

監聽器本質上就是利用回調機制,在某個動作發生前或后,執行我們自己的一些代碼。在Java語言中,可以使用接口來實現。

實現一個監聽器案例

為了方便,直接在spring環境中定義:以工作(work)為例,定義工作開始時(或結束時)的監聽器。

1. 定義回調的接口

package com.yawn.demo.listener;/** * @author Created by yawn on 2018-01-21 13:53 */public interface WorkListener {  void onStart(String name);}

2. 定義動作

package com.yawn.demo.service;import com.yawn.demo.listener.WorkListener;/** * @author Created by yawn on 2018-01-21 13:39 */@Servicepublic class MyService {  @Resource  private PersonService personService;  private WorkListener listener;  public void setWorkListener(WorkListener workListener) {    this.listener = workListener;  }  public void work(String name) {    listener.onStart(name);    personService.work();  }}

動作work為一個具體的方法,在work()方法的適當時機,調用前面定義的接口。此外,在這個動作定義類中,需要提高設置監聽器的方法。

3. 監聽測試

@RunWith(SpringRunner.class)@SpringBootTestpublic class DemoSpringAnnotationApplicationTests {  @Resource  private MyService myService;  @Test  public void test1() {    // 接口設置監聽器    myService.setWorkListener(new WorkListener() {      @Override      public void onStart(String name) {        System.out.println("Start work for " + name + " !");      }    });//    // lambda 表達式設置監聽器//    myService.setWorkListener(name -> System.out.println("Start work for " + name + " !"));    // 工作    myService.work("boss");  } @Test  public void test2() {   // 繼承實現類設置監聽器   myService.setWorkListener(new myWorkListener());   // 工作   myService.work("boss");  }  class myWorkListener extends WorkListenerAdaptor {    @Override    public void onStart(String name) {      System.out.println("Start work for " + name + " !");    }  }}

使用以上兩種方法測試,得到了結果為:

Start work for boss !working hard ...

說明在動作work發生之前,執行了我們在測試類中寫下的監聽代碼,實現類監聽的目的。

使用注解實現監聽器

在以上代碼中,調用 setWorkListener(WorkListener listener)  方法一般稱作設置(注冊)監聽器,就是將自己寫好的監聽代碼,設置為動作的監聽器。然而,在每次注冊監聽器時,一般需要寫一個類,實現定義好的接口或繼承實現接口的類,再重寫接口定義的方法即可。因此,聰明的程序員就想簡化這個過程,所以就想出了使用注解的方法。使用注解,將監聽代碼段寫在一個方法中,使用一個注解標記這個方法即可。

的確,使用變得簡單了,但實現卻不見得。

1. 定義一個注解

package com.yawn.demo.anno;@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface WorkListener {}

2. 解析注解

package com.yawn.demo.anno;import com.yawn.demo.service.MyService;import org.springframework.beans.BeansException;import org.springframework.beans.factory.InitializingBean;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.stereotype.Component;import javax.annotation.Resource;import java.lang.annotation.Annotation;import java.lang.reflect.Method;import java.util.LinkedHashMap;import java.util.Map;/** * @author Created by yawn on 2018-01-21 14:46 */@Componentpublic class WorkListenerParser implements ApplicationContextAware, InitializingBean {  @Resource  private MyService myService;  private ApplicationContext applicationContext;  @Override  public void afterPropertiesSet() throws Exception {    Map<String, Object> listenerBeans = getExpectListenerBeans(Controller.class, RestController.class, Service.class, Component.class);    for (Object listener : listenerBeans.values()) {      for (Method method : listener.getClass().getDeclaredMethods()) {        if (!method.isAnnotationPresent(WorkListener.class)) {          continue;        }        myService.setWorkListener(name -> {          try {            method.invoke(listener, name);          } catch (Exception e) {            e.printStackTrace();          }        });      }    }  }  /**   * 找到有可能使用注解的bean   * @param annotationTypes 需要進行掃描的類級注解類型   * @return 掃描到的beans的map   */  private Map<String, Object> getExpectListenerBeans(Class<? extends Annotation>... annotationTypes) {    Map<String, Object> listenerBeans = new LinkedHashMap<>();    for (Class<? extends Annotation> annotationType : annotationTypes) {      Map<String, Object> annotatedBeansMap = applicationContext.getBeansWithAnnotation(annotationType);      listenerBeans.putAll(annotatedBeansMap);    }    return listenerBeans;  }  @Override  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {    this.applicationContext = applicationContext;  }}

在注解的解析過程中,設置監聽器。

在解析類中,實現了接口ApplicationContextAware,為了在類中拿到ApplicationContext的引用,用于得到 IOC 容器中的 Bean;而實現接口InitializingBean,則是為了在一個合適的時機執行解析注解、設置監聽器的代碼。 如果不這樣做,可以在CommandLineRunner執行時調用解析、設置的代碼,而ApplicationContext也可以自動注入。

3. 測試

在執行完以上代碼后,監聽器就已經設置好了,可以進行測試了。

package com.yawn.demo.controller;import com.yawn.demo.anno.WorkListener;import com.yawn.demo.service.MyService;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;/** * @author Created by yawn on 2018-01-21 13:28 */@RestControllerpublic class TestController {  @Resource  private MyService myService;  @GetMapping("/work")  public Object work() {    myService.work("boss");    return "done";  }  @WorkListener  public void listen(String name) {    System.out.println("Start work for " + name + " !");  }}

寫一個監聽方法,參數類型和個數與接口相同,然后加上自定義的注解即可。當啟動環境后,監聽器就已經設置好了。

然后通過url調用myService的work()方法,可以看到結果:

Start work for boss !working hard ...

已經調用了監聽方法。在接下來的開發中,就可以使用這個注解注冊監聽器了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97在线免费观看| 91爱视频在线| 久久艹在线视频| 亚洲欧美中文字幕在线一区| 亚洲人成网7777777国产| 欧美—级a级欧美特级ar全黄| 亚洲精品动漫100p| 亚洲国产精品va在线看黑人动漫| 大胆欧美人体视频| 国产精品亚洲激情| 黑人巨大精品欧美一区二区免费| 伊人久久久久久久久久| 亚洲亚裔videos黑人hd| 亚洲欧美中文另类| 国产婷婷97碰碰久久人人蜜臀| 久久视频中文字幕| 69影院欧美专区视频| 欧洲午夜精品久久久| 精品国产一区二区三区久久| 国模叶桐国产精品一区| 欧美激情综合亚洲一二区| 亚洲午夜未满十八勿入免费观看全集| 中国人与牲禽动交精品| 欧美成人午夜免费视在线看片| 91在线观看免费高清| 国产成人精品在线播放| 亚洲欧洲日韩国产| 色系列之999| 久久视频免费在线播放| 中日韩美女免费视频网址在线观看| 日韩精品久久久久久福利| 久久久av免费| 久久精品国产亚洲| 在线观看精品国产视频| 日韩中文字幕在线精品| 91在线高清免费观看| 国产精品第8页| 7777精品视频| 国产69精品久久久久久| 欧美日韩色婷婷| 欧美另类交人妖| 欧美激情一区二区三区久久久| 亚洲成人精品视频在线观看| 欧美国产亚洲视频| 欧美性猛xxx| 国产精品偷伦免费视频观看的| 亚洲国产成人一区| 隔壁老王国产在线精品| 国产精品综合不卡av| 成人av番号网| 91在线视频免费| 亚洲图中文字幕| 欧美午夜精品在线| 久久人人爽人人爽爽久久| 国产亚洲欧洲高清| 久久久久久中文| 亚洲乱码一区二区| 欧美一二三视频| 亚洲人成绝费网站色www| 欧美成人午夜剧场免费观看| 欧美午夜精品久久久久久人妖| 亲爱的老师9免费观看全集电视剧| 国产一区香蕉久久| 国产精品情侣自拍| 国产视频在线观看一区二区| 国产欧美日韩91| 亚洲18私人小影院| 欧美激情精品久久久久久黑人| 欧美丰满老妇厨房牲生活| 欧美尺度大的性做爰视频| 亚洲精品资源美女情侣酒店| 亚洲一区亚洲二区亚洲三区| 国产69精品99久久久久久宅男| 国产成人精品av在线| 国产精品成人aaaaa网站| 久久久久久久久久久久久久久久久久av| 国产精品久久久久久久久免费看| 久久久精品久久久久| 欧美床上激情在线观看| 国产精品免费视频xxxx| 色综合天天综合网国产成人网| 97香蕉久久超级碰碰高清版| 精品久久久久久中文字幕一区奶水| 中文字幕视频一区二区在线有码| 91在线高清视频| 欧美精品在线视频观看| 日韩精品在线视频| 日韩av毛片网| 久久久久久这里只有精品| 国产精品国产三级国产专播精品人| 亚洲网在线观看| 国产免费观看久久黄| 2019av中文字幕| 国产精品亚洲网站| 久久精品亚洲国产| 亚洲人成绝费网站色www| 欧美日韩性视频| 欧美成人午夜剧场免费观看| 色婷婷综合成人| 国产成人97精品免费看片| 国产丝袜视频一区| 日韩欧美精品网站| 久久国产精品久久久久| 欧美日韩加勒比精品一区| 亚洲欧洲一区二区三区在线观看| 在线播放日韩欧美| 这里只有视频精品| 欧美一级免费视频| 亚洲成人久久网| 欧美在线免费视频| 日韩视频免费中文字幕| 大伊人狠狠躁夜夜躁av一区| 久久精品国产69国产精品亚洲| 最新国产精品拍自在线播放| 2018中文字幕一区二区三区| 裸体女人亚洲精品一区| 亚洲a∨日韩av高清在线观看| 国产欧美精品日韩| 欧洲日本亚洲国产区| 亚洲黄页视频免费观看| 亚洲精品美女久久久| 97成人超碰免| 最近2019年日本中文免费字幕| 欧洲精品在线视频| 91av视频在线| 亚洲综合成人婷婷小说| 欧美精品在线免费播放| 日韩精品在线观看网站| 中文字幕日韩在线观看| 亚洲最大的av网站| 777777777亚洲妇女| 91手机视频在线观看| 久久久亚洲精选| 一区国产精品视频| 91亚洲国产成人久久精品网站| 国产精品美女久久久久久免费| 国产精品久久久久久久久粉嫩av| 国产精品对白刺激| 色婷婷综合久久久久| 中文欧美在线视频| 国产亚洲欧洲高清| 九九热这里只有精品免费看| 欧美香蕉大胸在线视频观看| 中文字幕av一区二区三区谷原希美| 日韩有码视频在线| 97**国产露脸精品国产| 日韩女优人人人人射在线视频| 久久久精品久久久| 97av在线影院| 欧美最猛性xxxxx免费| 成人久久一区二区三区| 在线观看欧美视频| 精品日本高清在线播放| 91视频免费在线| 欧美亚洲视频在线看网址| 久久99久久99精品免观看粉嫩| 亚洲精品日产aⅴ| 欧美黄网免费在线观看| 欧美精品九九久久| 视频在线观看一区二区| 成人黄色免费在线观看| www.亚洲天堂| 欧美日韩中文字幕综合视频| 亚洲免费精彩视频|