Spring學習(十九)Bean 的方法注入和方法替換介紹

lookup方法注入指容器能夠重寫容器中bean的抽象或者具體方法,從而返回查找容器中其他bean的結果。

Spring IoC容器擁有複寫bean方法的能力,這項功能主要歸功與cglib這個類包,cglib類包可以在運行時動態的操作class字節碼,他能夠爲Bean動態的創建子類或者實現類。所以使用lookup方法注入的時候必須在項目中加入cglib類包。

那麼現在我們定義一個MagicBoss接口,並且在接口中我們聲明一個getCar接口方法。
public Interface MagicBoss{
    Car getCar();
}
下面我們可以不編寫任何的實現類,僅僅通過配置而不編寫任何的實現類便爲該接口提供動態的實現。讓getCar方法每次都能返回一個新的car實例。
<bean id="car" class="cn.lovepi.***.Car"
    p:brand="紅旗CA72" p:price="2666" scope="prototype"/>
<bean id="magicBoss" class="cn.lovepi.***.MagicBoss">
    <lookup-method name="getCar" bean="car"/>
</bean>

這樣Spring將在運行期爲MagicBoss提供動態的接口實現。他的效果就等同於如下的代碼:
public class MagicBossImpl implements MagicBoss,ApplicationContextAware{
    private ApplicationContext ctx;
    public Car getCar(){
        return (Car)ctx.getBean("car");
    }
    public void setApplicationContext(ApplicationContext ctx){
        this.ctx=ctx;
    }
}
注意
lookup方法注入是有使用條件的:一般希望一個singleton的bean返回時變爲一個prototype的bean的時候使用。

replaced方法替換實現MethodReplacer接口,替換目標Bean的方法

我們來看一下如下的兩端代碼:
public class Boss1 implements MagicBoss{
    public Car getCar(){
        Car car=new Car();
        car.setBrand("寶馬");
        return car;
    }
}

public class Boss2 implements MethodReplacer{
    public Object reimplement(Object arg0,Method arg1,Object[] arg2){
        Car car=new Car();
        car.setBrand("美人豹");
        return car;
    }
}
可以看到在Boss2中實現了MethodReplacer接口,在接口方法reimplement當中返回了一輛美人豹汽車。
爲了替換其他的bean就必須實現MethodReplacer接口,Spring將利用該接口方法來替換目標Bean。

接下來我們利用Spring的配置文件來實現使用Boss2的方法來替換Boss1的方法。
那麼請看如下的配置文件:
<bean id="boss2" class="cn.lovepi.injectfun.Boss2"/>
<bean id="boss1" class="cn.lovepi.injectfun.Boss1"/>
    <replaced-method name="getCar" replacer="boss2"></replaced-method>
</bean>

可以看到配置文件中配置了使用boss2的getCar方法來替換boss1中的對應方法。



發佈了68 篇原創文章 · 獲贊 132 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章