您好,登錄后才能下訂單哦!
本篇內容主要講解“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ù)學習!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。