溫馨提示×

溫馨提示×

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

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

Sping中l(wèi)ookup-method注入的方法是什么

發(fā)布時間:2021-12-16 09:29:04 來源:億速云 閱讀:132 作者:iii 欄目:大數(shù)據

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

lookup-method 注入

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

需要注意一下幾點:

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

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

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

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

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

package fiona.apple;

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

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

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

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

<!-- 作為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();}

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

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

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

任意方法替換

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

     使用基于XML的配置元數(shù)據,可以使用替換的方法元素替換已部署的bean的現(xiàn)有方法實現(xiàn)??紤]下面的類,它有一個名為computeValue的方法,覆蓋它:

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

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

/** * 用于重寫MyValueCalCulter中現(xiàn)有的CtudioValueString(String)實現(xiàn) */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/>來指示要重寫的方法的方法參數(shù)類型。只有當該方法重載且多個類型存在于類中時,參數(shù)的類型才是必需的。為了方便起見,參數(shù)的類型字符串可以是完全限定類型名的子字符串。例如,以下所有內容都匹配java.lang.String:

java.lang.StringStringStr

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

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

向AI問一下細節(jié)

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

AI