本篇內(nèi)容主要講解“Sping中l(wèi)ookup-method注入的方法是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Sping中l(wèi)ookup-method注入的方法是什么”吧!
創(chuàng)新互聯(lián)是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來公司不斷探索創(chuàng)新,始終堅(jiān)持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過去的十余年時(shí)間我們累計(jì)服務(wù)了上千家以及全國政企客戶,如展覽展示等企業(yè)單位,完善的項(xiàng)目管理流程,嚴(yán)格把控項(xiàng)目進(jìn)度與質(zhì)量監(jiān)控加上過硬的技術(shù)實(shí)力獲得客戶的一致表揚(yáng)。
lookup-method 注入
lookup-method注入是容器重寫容器管理(container-managed) bean上的方法并返回容器中另一個(gè)命名bean的lookup結(jié)果。lookup通常需要一個(gè)prototype bean,如前一節(jié)所述。Spring框架通過使用CGLIB庫(CGLIB是一個(gè)強(qiáng)大的、高性能的代碼生成庫。其被廣泛應(yīng)用于AOP框架(Spring、dynaop)中,用以提供方法攔截操作)中的字節(jié)碼生成動(dòng)態(tài)生成覆蓋該方法的子類來實(shí)現(xiàn)此方法注入。
需要注意一下幾點(diǎn):
要使這個(gè)動(dòng)態(tài)子類工作,Spring bean容器子類不能是final的類,要重寫的方法也不能是final的類。
單元測試具有抽象方法的類需要自己對該類進(jìn)行子類化,并對其它抽象方法的實(shí)現(xiàn)。
具體的類提供組件lookup需要的具體的方法。
另一個(gè)關(guān)鍵限制是lookup-method不能與工廠方法一起,特別是不能與配置類中的@Bean方法一起,因?yàn)樵谶@種情況下,容器不負(fù)責(zé)創(chuàng)建實(shí)例,因此不能動(dòng)態(tài)創(chuàng)建運(yùn)行時(shí)生成的子類。
對于前面代碼中的CommandManager類,Spring容器動(dòng)態(tài)重寫createCommand()方法的實(shí)現(xiàn)。CommandManager類沒有任何Spring依賴,重新寫的示例所示:
package fiona.apple;
public abstract class CommandManager {
public Object process(Object commandState) {
// 獲取命令接口的新實(shí)例
Command command = createCommand();
// 在(希望是全新的)命令實(shí)例上設(shè)置狀態(tài)
command.setState(commandState);
return command.execute();
}
// 可以。。。但是這種方法的實(shí)現(xiàn)在哪里呢?
protected abstract Command createCommand();
}
在要注入的方法的client 類(在本例中是CommandManager)中,要注入的方法需要以下形式的簽名:
[abstract] theMethodName(no-arguments);
如果方法是抽象的,則動(dòng)態(tài)生成的子類實(shí)現(xiàn)該方法。否則,動(dòng)態(tài)生成的子類將重寫在原來類中定義的方法。請使用以下示例:
commandManager的bean需要myCommand bean的新實(shí)例時(shí)調(diào)用自己的createCommand()方法。如果真的需要myCommand bean,那么必須將其部署為prototype 。如果它是單例的,則每次都返回相同的myCommand bean實(shí)例。
或者,經(jīng)??梢砸蕾囉?target bean根據(jù)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();
}
注意,你通常應(yīng)該用一個(gè)具體的子類實(shí)現(xiàn)來聲明帶注解的lookup method,以便它們與Spring的組件掃描規(guī)則兼容,在該規(guī)則中,抽象類在默認(rèn)情況下會被忽略。此限制不適用于指明注冊或?qū)氲腷ean類。
訪問不同Scoped 目標(biāo)bean的另一種方法是ObjectFactory/Provider注入點(diǎn)。將 Scoped bean視為依賴。
你還可能發(fā)現(xiàn)ServiceLocatorFactoryBean(在org.springframework.beans.factory.config包中)非常有用。
任意方法替換
method 注入的一種不如lookup 方法注入有用的形式是用另一個(gè)方法實(shí)現(xiàn)替換托管bean中的任意方法的能力。
使用基于XML的配置元數(shù)據(jù),可以使用替換的方法元素替換已部署的bean的現(xiàn)有方法實(shí)現(xiàn)??紤]下面的類,它有一個(gè)名為computeValue的方法,覆蓋它:
public class MyValueCalculator {
public String computeValue(String input) {
}
//其它methods...
}
實(shí)現(xiàn)org.springframework.beans.factory.support.MethodReplacer接口的類提供了新的方法定義,如下例所示:
/**
* 用于重寫MyValueCalCulter中現(xiàn)有的CtudioValueString(String)實(shí)現(xiàn)
*/
public class ReplacementComputeValue implements MethodReplacer {
public Object reimplement(Object o, Method m, Object[] args) throws Throwable {
// 獲取輸入值,對其進(jìn)行處理,并返回計(jì)算結(jié)果
String input = (String) args[0];
...
return ...;
}
}
部署初始類并指定方法重寫的bean,類似于以下示例:
String
可以在
java.lang.StringStringStr
因?yàn)閰?shù)的數(shù)量通可以區(qū)分每個(gè)可能的情況,所以簡化方式可以節(jié)省大量的輸入,只允許鍵入與參數(shù)類型匹配的最短字符串。
到此,相信大家對“Sping中l(wèi)ookup-method注入的方法是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!