Spring学习----------Bean 的方法注入和方法替换介绍
2018-02-27 18:09
513 查看
lookup方法注入:指容器能够重写容器中bean的抽象或者具体方法,从而返回查找容器中其他bean的结果。
Spring IoC容器拥有复写bean方法的能力,这项功能主要归功与cglib这个类包,cglib类包可以在运行时动态的操作class字节码,他能够为Bean动态的创建子类或者实现类。所以使用lookup方法注入的时候必须在项目中加入cglib类包。
那么现在我们定义一个MagicBoss接口,并且在接口中我们声明一个getCar接口方法。[java] view plain copy public Interface MagicBoss{
Car getCar();
}
下面我们可以不编写任何的实现类,仅仅通过配置而不编写任何的实现类便为该接口提供动态的实现。让getCar方法每次都能返回一个新的car实例。[html] view plain copy <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提供动态的接口实现。他的效果就等同于如下的代码:
[java] view plain copy 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的方法
我们来看一下如下的两端代码:[java] view plain copy 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的方法。那么请看如下的配置文件:[html] view plain copy <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中的对应方法。
Spring IoC容器拥有复写bean方法的能力,这项功能主要归功与cglib这个类包,cglib类包可以在运行时动态的操作class字节码,他能够为Bean动态的创建子类或者实现类。所以使用lookup方法注入的时候必须在项目中加入cglib类包。
那么现在我们定义一个MagicBoss接口,并且在接口中我们声明一个getCar接口方法。[java] view plain copy public Interface MagicBoss{
Car getCar();
}
下面我们可以不编写任何的实现类,仅仅通过配置而不编写任何的实现类便为该接口提供动态的实现。让getCar方法每次都能返回一个新的car实例。[html] view plain copy <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提供动态的接口实现。他的效果就等同于如下的代码:
[java] view plain copy 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的方法
我们来看一下如下的两端代码:[java] view plain copy 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的方法。那么请看如下的配置文件:[html] view plain copy <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中的对应方法。
相关文章推荐
- Spring学习----------Bean 的三种依赖注入方式介绍
- Spring学习:注入方法和bean的Scope(xml)
- SPRING.NET 1.3.2 学习20--方法注入之替换方法注入
- Spring学习(十八)Bean 的三种依赖注入方式介绍
- Spring学习(十九)Bean 的方法注入和方法替换介绍
- servlet中注入spring托管bean的方法
- 使用Spring方法注入协调不同步的bean
- 使用Spring方法注入协调不同步的bean
- Spring学习笔记 关于Bean的初始化和清理-init和destroy方法
- Spring.Net对方法的注入(学习笔记三)
- SPRING.NET 1.3.2 学习18--方法注入之IObjectFactoryAware,IObjectNameAware
- SPRING.NET 1.3.2 学习23--使用方法的返回值进行注入
- Spring方法注入非单例bean的调用
- Spring强制向servlet中注入bean的方法
- SPRING.NET 1.3.2 学习19--方法注入之查询方法注入
- Spring2.5.6学习笔记-实例化bean的几种方法
- 框架学习之Spring 第二节 采用Spring管理Bean和依赖注入
- spring开发_注入其他Bean的方法返回值_MethodInvokingFactoryBean
- 框架学习之Spring 第二节 采用Spring管理Bean和依赖注入
- main方法中调用spring注入bean