接上篇
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(),"捷豹");
}
未完。。。