Spring:将一个懒惰的单例bean注入一个渴望的单例bean

时间:2012-11-29 08:18:48

标签: spring dependency-injection

最近我遇到了这个要求,我们有一个Foo bean和一个Bar bean;两者都是单身人士,而Bar需要注入Foo。

但是,Bar是资源/内存的重量级bean,因此我们需要将其实例化延迟到Foo实际调用它的方法。问题是,Foo必须得到热切的实例化。那么有什么不同的方法呢?

我在下面的答案中分享了我的解决方案。了解其他任何方法都会很棒。

1 个答案:

答案 0 :(得分:0)

从本质上讲,这就是我所做的:

1)让Bar懒惰地实例化,

2)使用LazyInitTargetSource并将其指向上面的bean,

3)使用指向上面目标源的`ProxyFactoryBean',

4)急切地实例化Foo并将上面的代理注入其中。

此解决方案比使用lookup-method解决方案更冗长,更复杂。但是lookup-method解决方案难以进行单元测试,我觉得与其他解决方案相比,它与Spring的关系更紧密。

以下是配置:

<bean id="barTarget" class="bar.Bar" lazy-init="true">
    <constructor-arg value="423" />
</bean>
<bean id="singletonTargetSource" class="org.springframework.aop.target.LazyInitTargetSource">
    <property name="targetBeanName" value="barTarget" />
</bean>
<bean id="bar" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="targetSource" ref="singletonTargetSource" />           
</bean>
<bean id="foo" class="foo.Foo">
    <property name="bar" ref="bar" />
</bean>