本篇内容:
- 1、lookup方法注入
- 2、方法替换
一、lookup方法注入
- Spring的GGLib类包可以在运行期动态操作Class字节码,使SpringIOC容器有复写Bean的方法能力
1、创建java实体对象
public class CarObject {
private String title;
private String desc;
public void getData() {
System.out.println( "CarObject{" +
"title='" + title + '\'' +
", desc='" + desc + '\'' +
'}');
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
2、创建接口
public interface MagicBoss {
CarObject getCar();
}
3、配置文件
<bean id="car" class="com.demo.CarObject" p:title="银色" p:desc="雷克萨斯"/>
<bean id="magicBoss" class="com.demo.MagicBoss">
<lookup-method name="getCar" bean="car"/>
</bean>
说明:
1、bean id="car" class="com.demo.CarObject" p:title="银色" p:desc="雷克萨斯"
- car:propertype类型的Bean
- p:title="银色":注入title属性参数
2、lookup-method name="getCar" bean="car"
- lookup-method:为magicBoss提供动态实现类返回bean="car"对象(每次都会从容器中获取car实体对象)
注意:
- lookup方法注入是有一定范围,一般在希望通过一个sigleton Bean获取一个prototype Bean时使用
4、测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"file:src/main/resources/car.xml"})
public class CarObjectTest {
@Autowired
private MagicBoss magicBoss;
@Test
public void getBean() {
magicBoss.getCar().getData();
}
}
二、方法替换
- 使用某个bean的方法去替换另外一个Ben的方法
1、定义java类
public class CarFactory {
public CarObject getCar() {
CarObject carObject = new CarObject();
carObject.setDesc("宝马3");
carObject.setTitle("灰色");
return carObject;
}
}
2、定义替换方法类
public class CarShop implements MethodReplacer {
public Object reimplement(Object o, Method method, Object[] objects) throws Throwable {
CarObject carObject = new CarObject();
carObject.setTitle("奔驰");
carObject.setDesc("黑色");
return carObject;
}
}
- 说明:
- MethodReplacer接口中的方法用于替换目标Bean的方法
3、配置文件
<!--方法替换-->
<bean id="carFactory" class="com.demo.CarFactory">
<replaced-method name="getCar" replacer="carSop"/>
</bean>
<bean id="carSop" class="com.demo.CarShop"/>
- 说明:
- replaced-method name="getCar" replacer="carSop":使用carSop的MethodReplace接口方法替换本对象中的name="getCar"方法
4、测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"file:src/main/resources/car.xml"})
public class CarShopTest {
@Autowired
private CarFactory carFactory;
@Test
public void getCar(){
carFactory.getCar().getData();
}
}
- 说明:
- 将会返回CarShop中的数据
demo代码:
https://github.com/brusion/brusion-code/tree/master/demo-java/03%20-%20demo%20-%20spring/spring-study-4x/01-ioc/01-ioc-method
网友评论