5.Spring4.x学习[核心篇][Spring在IOC中装配Bean](2)

接上篇
1.Bean中方法注入
lookup方法注入,可以很方便的复写Bean,达到Bean的复用,这个要归功于Spring中的CGLib代理。比如我要在一个singleton的Bean中使用一个每次新建的Bean,比如一个Boss,有多辆Car
- 1.声明一个接口

public interface MagicBoss {
   Car getCar();
   Boss getBoss();
}

-2. 声明Bean配置

  <bean id="boss" class="com.smart.ditype.Boss"
          p:name="boss" p:car-ref="bossCar" p:car=""/>

  <bean id="magicBoss" class="com.smart.injectfun.MagicBoss" >
    <lookup-method name="getCar" bean="car"/>
    <lookup-method name="getBoss" bean="boss"/>
  </bean>

MagicBoss 是一个接口,此接口不需要实现,使用lookup-method标签,会使用代理直接指定要返回的Bean,如果bean指定的是singleton,那么就跟直接配置一个单独singleto的bossBean 指定的Car一样,此时忽略Car的protoType。如果Bean是protoType,那么该种配置每次返回一个新的Car.
2.方法替换(狸猫换太子)
用于替换其他Bean的Bean必须实现MethodReplacer接口。
例如用一个Boss2替换Boss1

public class Boss1 implements MagicBoss{

    public Car getCar() {
        Car car = new Car();
        car.setBrand("宝马Z4");
        return car;
    }

    @Override
    public Boss getBoss() {
        return null;
    }
}

public class Boss2 implements MethodReplacer {
    public Object reimplement(Object arg0, Method arg1, Object[] arg2)
            throws Throwable {
        Car car = new Car();
        car.setBrand("美人豹");
        return car;
    }
}

reimplement 返回一个Car,替换Boss1中原有的Car。
Bean配置如下:

  <bean id="boss2" class="com.smart.injectfun.Boss2"/>

  <bean id="boss1" class="com.smart.injectfun.Boss1">
     <replaced-method name="getCar" replacer="boss2"></replaced-method>
  </bean>

这样配置之后,返回Boss1的Car被替换了。

    @Test
    public void testReplace(){
        MagicBoss mboss = (MagicBoss) factory.getBean("boss1");
        assertEquals(mboss.getCar().getBrand(),"捷豹");
    }

未完。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值