如果希望每次调用BeanA的getBeanB()时都能返回一个新的BeanB一种可选的方案是让Bean实现BeanFactoryAware接口,让BeanA能访问容器的引用,以下代码可以实现方式达到目的:
public BeanB getBeanB(){ return (BeanB)factory.getBean("beanb"); }
但是上面的方法依赖Spring框架,不是最好的方案
利用lookup方法注入
Spring IoC容器有复写Bean方法的能力,这项功能归功于CGLib类包,CGLib可以在运行期动态的操作Class字节码,为bean动态的创建子类或实现类,现在我们声明一个接口,如下:
public interface BeanInterface{ BeanB getBeanB(); }
下面不写任何实现,仅通过配置为该接口提供动态的实现,让getBeanB()接口方法每次都返回新的BeanB
<bean id="beanB" class="com.demo.BeanB" /> <bean id="beanInterface" class="com.demo.BeanInterface"> <lookup-method name="getBeanB" bean="beanB" /> </bean>
通过lookup-method元素标签为BeanInterface的getBeanB提供动态实现,返回prototype的BeanB
ps:lookup方法注入是有一定使用范围的,一般就是在希望通过一个singleton Bean获取一个prototype Bean时使用。
下面是两下相关的博客
http://liaofeng-xiao.iteye.com/blog/643312
http://www.cnblogs.com/shipengzhi/articles/2099693.html