Spring学习----------Bean 的方法注入和方法替换介绍

lookup方法注入指容器能够重写容器中bean的抽象或者具体方法,从而返回查找容器中其他bean的结果。

Spring IoC容器拥有复写bean方法的能力,这项功能主要归功与cglib这个类包,cglib类包可以在运行时动态的操作class字节码,他能够为Bean动态的创建子类或者实现类。所以使用lookup方法注入的时候必须在项目中加入cglib类包。

那么现在我们定义一个MagicBoss接口,并且在接口中我们声明一个getCar接口方法。
[java] view plain copy
  1. public Interface MagicBoss{  
  2.     Car getCar();  
  3. }  
下面我们可以不编写任何的实现类,仅仅通过配置而不编写任何的实现类便为该接口提供动态的实现。让getCar方法每次都能返回一个新的car实例。
[html] view plain copy
  1. <bean id="car" class="cn.lovepi.***.Car"  
  2.     p:brand="红旗CA72" p:price="2666" scope="prototype"/>  
  3. <bean id="magicBoss" class="cn.lovepi.***.MagicBoss">  
  4.     <lookup-method name="getCar" bean="car"/>  
  5. </bean>  

这样Spring将在运行期为MagicBoss提供动态的接口实现。他的效果就等同于如下的代码:
[java] view plain copy
  1. public class MagicBossImpl implements MagicBoss,ApplicationContextAware{  
  2.     private ApplicationContext ctx;  
  3.     public Car getCar(){  
  4.         return (Car)ctx.getBean("car");  
  5.     }  
  6.     public void setApplicationContext(ApplicationContext ctx){  
  7.         this.ctx=ctx;  
  8.     }  
  9. }  
注意
lookup方法注入是有使用条件的:一般希望一个singleton的bean返回时变为一个prototype的bean的时候使用。

replaced方法替换实现MethodReplacer接口,替换目标Bean的方法

我们来看一下如下的两端代码:
[java] view plain copy
  1. public class Boss1 implements MagicBoss{  
  2.     public Car getCar(){  
  3.         Car car=new Car();  
  4.         car.setBrand("宝马");  
  5.         return car;  
  6.     }  
  7. }  
  8.   
  9. public class Boss2 implements MethodReplacer{  
  10.     public Object reimplement(Object arg0,Method arg1,Object[] arg2){  
  11.         Car car=new Car();  
  12.         car.setBrand("美人豹");  
  13.         return car;  
  14.     }  
  15. }  
可以看到在Boss2中实现了MethodReplacer接口,在接口方法reimplement当中返回了一辆美人豹汽车。
为了替换其他的bean就必须实现MethodReplacer接口,Spring将利用该接口方法来替换目标Bean。

接下来我们利用Spring的配置文件来实现使用Boss2的方法来替换Boss1的方法。
那么请看如下的配置文件:
[html] view plain copy
  1. <bean id="boss2" class="cn.lovepi.injectfun.Boss2"/>  
  2. <bean id="boss1" class="cn.lovepi.injectfun.Boss1"/>  
  3.     <replaced-method name="getCar" replacer="boss2"></replaced-method>  
  4. </bean>  

可以看到配置文件中配置了使用boss2的getCar方法来替换boss1中的对应方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值