久久久精品一区ed2k-女人被男人叉到高潮的视频-中文字幕乱码一区久久麻豆樱花-俄罗斯熟妇真实视频

如何實現(xiàn)回調(diào)和spring的LambdaSafe類

這篇文章主要介紹如何實現(xiàn)回調(diào)和spring的LambdaSafe類,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

成都創(chuàng)新互聯(lián)專注于陸河企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計,商城網(wǎng)站制作。陸河網(wǎng)站建設(shè)公司,為陸河等地區(qū)提供建站服務(wù)。全流程按需求定制制作,專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

   在閱讀spring boot源碼時發(fā)現(xiàn)了WebServerFactoryCustomizerBeanPostProcessor類中有

LambdaSafe.callbacks(WebServerFactoryCustomizer.class, getCustomizers(), webServerFactory)
                .withLogger(WebServerFactoryCustomizerBeanPostProcessor.class)
                .invoke((customizer) -> customizer.customize(webServerFactory));

的用法。搜索了一下國內(nèi)網(wǎng)站,發(fā)現(xiàn)沒有相關(guān)資料,所以只能去spring官方網(wǎng)站上查閱文檔學(xué)習(xí)一下。
   我們知道一切皆可“類”化的java中沒有函數(shù)指針,而函數(shù)指針可以用來實現(xiàn)編程中較為普遍使用的“回調(diào)”。所謂“回調(diào)“是和“調(diào)用”相反的過程,如果用類和消息來理解就是,類A調(diào)用類B的方法,可以認(rèn)為是類A向類B發(fā)送了一個消息,這個過程被稱為”調(diào)用”。對于類B來說,B 被動接收了這個消息。但是如果類B的方法在處理這個消息的過程中,又需要類A才有的數(shù)據(jù)或者類A才有能力拿到的數(shù)據(jù),這時候類B需要向類A發(fā)送一個消息(調(diào)用類A的方法),主動請求獲取數(shù)據(jù)。這時候類B就需要知道類A的方法如何調(diào)用,這個過程稱為”回調(diào)”。
   如果是c/c++,可以直接給類B傳入一個類A方法的函數(shù)指針。但是java中不存在現(xiàn)成的“函數(shù)指針”可以使用,所以出現(xiàn)了幾種類“函數(shù)指針”的形式。一種是比較常見的使用接口+方法的形式實現(xiàn)類函數(shù)指針的方式,這種接口被稱為函數(shù)式接口,另一種是java 8中的新特性lambda表達(dá)式,本質(zhì)上也是一種函數(shù)式接口。
   Java中定義了一個 @FunctionalInterface注解來修飾接口實現(xiàn)的”函數(shù)指針”,但是這個注解并不是必須的,只要滿足函數(shù)式接口標(biāo)準(zhǔn)的接口都可以作為”函數(shù)指針”。如果一個接口不滿足函數(shù)式接口標(biāo)準(zhǔn),同時注解了 @FunctionalInterface,那么編譯器就會報錯,這個注解相當(dāng)于能夠更好的方便編譯器進(jìn)行檢查。現(xiàn)在我們以上面代碼中涉及的函數(shù)式接口來舉例。

@FunctionalInterface
public interface WebServerFactoryCustomizer<T extends WebServerFactory> {
    void customize(T factory);
}
WebServerFactoryCustomizer是一個提供給用戶用來定制WebServerFactory實例的接口。這個函數(shù)式接口的使用是在上面代碼的invoke方法的lambda表達(dá)式中,主要是處理傳入的WebServerFactory實例的bean,然后繼承這個函數(shù)式接口就可以對這個實例為所欲為。
好了,基礎(chǔ)介紹完了,終于到我們的主角LambdaSafe類了。spring 官方文檔給的解釋是

Utility that can be used to invoke lambdas in a safe way. Primarily designed to help support generically typed callbacks where class cast exceptions need to be dealt with due to class erasure.

。大意就是說LambdaSafe可以用來安全的運行l(wèi)ambda表達(dá)式,所謂的安全就是指可以支持處理在“回調(diào)”過程中因為類型擦除(java泛型中的概念)而需要拋出異常的情況。
   那么實際上如何實現(xiàn)的呢?先看LambdaSafe.callbacks方法。在上面代碼中,LambdaSafe.callbacks傳入了WebServerFactoryCustomizer.class、getCustomizers()和需要被為所欲為的WebServerFactory實例。getCustomizers()的返回值會獲取所有WebServerFactoryCustomizer函數(shù)式接口的實現(xiàn)類,可以理解獲取了一堆函數(shù)指針。

private List<WebServerFactoryCustomizer<?>> customizers;
private Collection<WebServerFactoryCustomizer<?>> getCustomizers() {
  if (this.customizers == null) {
    // Look up does not include the parent context
    this.customizers = new ArrayList<>(getWebServerFactoryCustomizerBeans());
    this.customizers.sort(AnnotationAwareOrderComparator.INSTANCE);
    this.customizers = Collections.unmodifiableList(this.customizers);
  }
  return this.customizers;
}

callbacks方法返回的是

public static <C, A> Callbacks<C, A>
callbacks(Class<C> callbackType,
                    Collection<? extends C> callbackInstances,
                    A argument,
                    Object... additionalArguments);

LambdaSafe中的內(nèi)部類LambdaSafe.Callback,其中A和C是兩個泛型,這里分別對應(yīng)的是WebServerFactoryCustomizer.class和WebServerFactoryCustomizer.然后這個類有一個withLogger方法用來打印日志,這樣在執(zhí)行l(wèi)ambda表達(dá)式的過程中就能記錄拋出的異常日志,并且日志頭打印的是傳入?yún)?shù)WebServerFactoryCustomizerBeanPostProcessor.class類(不會被擦除效果影響),最后這個withLogger方法返回的參數(shù)是SELF,代表LambdaSafe.Callback自己。這樣LambdaSafe.Callback實例又調(diào)用了自己的invoke參數(shù),執(zhí)行了getCustomizers方法返回的所有WebServerFactoryCustomizer函數(shù)式接口的實現(xiàn)類的customize方法。
   具體看下invoke的代碼,也挺有意思的。

private final Collection<? extends C> callbackInstances;
public void invoke(Consumer<C> invoker) {
  this.callbackInstances.forEach((callbackInstance) -> {
    invoke(callbackInstance, () -> {
      invoker.accept(callbackInstance);
      return null;
    });
  });
}

Consumer也是一種函數(shù)式接口,這里用來代表(customizer) -> customizer.customize(webServerFactory)的lambda表達(dá)式。callbackInstances存儲了上面說到的所有WebServerFactoryCustomizer函數(shù)式接口的實現(xiàn)類,這里邊遍歷邊通過invoker.accept()方法執(zhí)行每個函數(shù)式接口的customize方法。這樣整個代碼邏輯就完全了。

以上是“如何實現(xiàn)回調(diào)和spring的LambdaSafe類”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

當(dāng)前文章:如何實現(xiàn)回調(diào)和spring的LambdaSafe類
瀏覽路徑:http://sd-ha.com/article36/jgiisg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)站制作手機(jī)網(wǎng)站建設(shè)、企業(yè)建站、小程序開發(fā)、網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化