1.不同作用域的Bean的协调
同作用域的Bean可以简单的用ref定义依赖即可
若singleton依赖一个prototypeBean因为singletonBean 能被创建一次,也只有一次机会来创建依赖关系,而,依赖的prototypeBean会不断的产生新的Bean实例,所以singleBean的依赖将一直是最开始的Bean实例,获取的singleBean的一次也只能获取最开始的Bean实例,仅通过依赖配置不能解决这个问题
解决方法: 方法注入lookup方法
lookup方法的典型实现是在Bean中定义一个抽象的查找方法,从而将Bean转换为一个抽象类,声明一个lookup方法,让他返回一个non-singletonBean 实例
2.代码说明:
创建一个HelperBean
public class HelperBean{
public void dosomehelp(){} //普通的业务函数
}
创建有抽象方法的Bean类,即作用域singleton的Bean
public abstract class abstractLookupBean{
public abstract HelperBean getMyHelperBean();//定义抽象方法,spring负责实现
public HelperBean getHelperBean() {
return getMyHelperBean();
}
}
在配置文件中作如下配置
<bean id="helperbean" class="类的全路径" scope="prototype" />
<bean id="abstractLookupBean" class="类的全路径" >
<lookup-method name="getMyHelperBean" bean="helperbean"> //bean 属性是prototype的id
</bean>
最后编写测试类测试
AbstractApplicationContext ctx = newClassPathXmlApplicationContext("bean.xml");
AbstractLookupBean bean = (AbstractLookupBean) ctx.getBean(" 配置文件中 bean的id全名称");
HelperBean bean1 = bean.getHelperBean();
HelperBean bean2 = bean.getHelperBean();
system.out.println((bean1 == bean2));
输出false则成功