最近我遇到了这个要求,我们有一个Foo bean和一个Bar bean;两者都是单身人士,而Bar需要注入Foo。
但是,Bar是资源/内存的重量级bean,因此我们需要将其实例化延迟到Foo实际调用它的方法。问题是,Foo必须得到热切的实例化。那么有什么不同的方法呢?
我在下面的答案中分享了我的解决方案。了解其他任何方法都会很棒。
答案 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>