真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

本篇內(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    

可以在中使用一個(gè)或多個(gè)來指示要重寫的方法的方法參數(shù)類型。只有當(dāng)該方法重載且多個(gè)類型存在于類中時(shí),參數(shù)的類型才是必需的。為了方便起見,參數(shù)的類型字符串可以是完全限定類型名的子字符串。例如,以下所有內(nèi)容都匹配java.lang.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í)!


網(wǎng)站名稱:Sping中l(wèi)ookup-method注入的方法是什么
鏈接分享:http://weahome.cn/article/psjpsj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部