91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Sping中lookup-method注入的方法是什么

發布時間:2021-12-16 09:29:04 來源:億速云 閱讀:134 作者:iii 欄目:大數據

本篇內容主要講解“Sping中lookup-method注入的方法是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Sping中lookup-method注入的方法是什么”吧!

lookup-method 注入

    lookup-method注入是容器重寫容器管理(container-managed) bean上的方法并返回容器中另一個命名bean的lookup結果。lookup通常需要一個prototype  bean,如前一節所述。Spring框架通過使用CGLIB庫(CGLIB是一個強大的、高性能的代碼生成庫。其被廣泛應用于AOP框架(Spring、dynaop)中,用以提供方法攔截操作)中的字節碼生成動態生成覆蓋該方法的子類來實現此方法注入。

需要注意一下幾點:

  • 要使這個動態子類工作,Spring bean容器子類不能是final的類,要重寫的方法也不能是final的類。

  • 單元測試具有抽象方法的類需要自己對該類進行子類化,并對其它抽象方法的實現。

  • 具體的類提供組件lookup需要的具體的方法。

  • 另一個關鍵限制是lookup-method不能與工廠方法一起,特別是不能與配置類中的@Bean方法一起,因為在這種情況下,容器不負責創建實例,因此不能動態創建運行時生成的子類。

對于前面代碼中的CommandManager類,Spring容器動態重寫createCommand()方法的實現。CommandManager類沒有任何Spring依賴,重新寫的示例所示:

package fiona.apple;

public abstract class CommandManager {
   public Object process(Object commandState) {        // 獲取命令接口的新實例        Command command = createCommand();        // 在(希望是全新的)命令實例上設置狀態        command.setState(commandState);        return command.execute();    }
   // 可以。。。但是這種方法的實現在哪里呢?    protected abstract Command createCommand();}

在要注入的方法的client 類(在本例中是CommandManager)中,要注入的方法需要以下形式的簽名:

<public|protected> [abstract] <return-type> theMethodName(no-arguments);

如果方法是抽象的,則動態生成的子類實現該方法。否則,動態生成的子類將重寫在原來類中定義的方法。請使用以下示例:

<!-- 作為prototype部署的bean(非單例) --><bean id="myCommand" class="fiona.apple.AsyncCommand" scope="prototype">    <!-- 根據需要在此處插入依賴項 --></bean>
<!-- commandProcessor使用statefulCommandHelper --><bean id="commandManager" class="fiona.apple.CommandManager">    <lookup-method name="createCommand" bean="myCommand"/></bean>

    commandManager的bean需要myCommand bean的新實例時調用自己的createCommand()方法。如果真的需要myCommand bean,那么必須將其部署為prototype 。如果它是單例的,則每次都返回相同的myCommand bean實例。

    或者,經常可以依賴于 target  bean根據lookup method的返回類型得到解決:

public abstract class CommandManager {
   public Object process(Object commandState) {        MyCommand command = createCommand();        command.setState(commandState);        return command.execute();    }
   @Lookup    protected abstract MyCommand createCommand();}

注意,你通常應該用一個具體的子類實現來聲明帶注解的lookup method,以便它們與Spring的組件掃描規則兼容,在該規則中,抽象類在默認情況下會被忽略。此限制不適用于指明注冊或導入的bean類。

     訪問不同Scoped 目標bean的另一種方法是ObjectFactory/Provider注入點。將 Scoped  bean視為依賴。

 你還可能發現ServiceLocatorFactoryBean(在org.springframework.beans.factory.config包中)非常有用。

任意方法替換

      method 注入的一種不如lookup 方法注入有用的形式是用另一個方法實現替換托管bean中的任意方法的能力。

     使用基于XML的配置元數據,可以使用替換的方法元素替換已部署的bean的現有方法實現。考慮下面的類,它有一個名為computeValue的方法,覆蓋它:

public class MyValueCalculator {
   public String computeValue(String input) {          }
    //其它methods...}

實現org.springframework.beans.factory.support.MethodReplacer接口的類提供了新的方法定義,如下例所示:

/** * 用于重寫MyValueCalCulter中現有的CtudioValueString(String)實現 */public class ReplacementComputeValue implements MethodReplacer {
   public Object reimplement(Object o, Method m, Object[] args) throws Throwable {        // 獲取輸入值,對其進行處理,并返回計算結果        String input = (String) args[0];        ...        return ...;    }}

部署初始類并指定方法重寫的bean,類似于以下示例:

<bean id="myValueCalculator" class="x.y.z.MyValueCalculator">    <!-- 任意 method replacement -->    <replaced-method name="computeValue" replacer="replacementComputeValue">        <arg-type>String</arg-type>    </replaced-method></bean>
<bean id="replacementComputeValue" class="a.b.c.ReplacementComputeValue"/>

可以在<replaced-method/>中使用一個或多個<arg-type/>來指示要重寫的方法的方法參數類型。只有當該方法重載且多個類型存在于類中時,參數的類型才是必需的。為了方便起見,參數的類型字符串可以是完全限定類型名的子字符串。例如,以下所有內容都匹配java.lang.String:

java.lang.StringStringStr

   因為參數的數量通可以區分每個可能的情況,所以簡化方式可以節省大量的輸入,只允許鍵入與參數類型匹配的最短字符串。

到此,相信大家對“Sping中lookup-method注入的方法是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

读书| 防城港市| 内乡县| 东宁县| 广水市| 金川县| 宣威市| 大邑县| 宁化县| 柏乡县| 阿瓦提县| 莱芜市| 桃园县| 桂平市| 内丘县| 武穴市| 天柱县| 三河市| 沁阳市| 渝北区| 凤山市| 闻喜县| 吴川市| 忻城县| 巫山县| 广宁县| 石狮市| 苏州市| 永吉县| 乐亭县| 镇江市| 高尔夫| 太白县| 达州市| 大冶市| 绍兴市| 永宁县| 随州市| 安国市| 当涂县| 城固县|