Spring lookup方法注入

无状态的Bean的作用域一般可以配置成singleton单实例,如果我们向singleton的BeanA注入prototype的BeanB,并希望每次调用BeanA的getBeanB()时都能返回一个新的BeanB,使用传统的注入方式方法将无法实现这样的要求。因为singleton的Bean注入关联Bean的动作只有一次,虽然BeanB的作用域是prototype类型,返回的对象不是最开始注入的那个bean
如果希望每次调用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

猜你喜欢

转载自yzhw.iteye.com/blog/1698838