我有一个单例Spring bean(它必须保持一个单例),每次执行某个方法时,它需要另一个bean(称为X)的新实例。
到目前为止,我研究了以下方法:
=>如何在bean中注入一个工厂,以便在我认为合适并从中获取spring托管实例时可以调用其工厂方法。
最佳答案
此类方案的选择方法称为lookup method injection。简而言之,这使用了调用bean方法的方法,从而创建了一个新bean实例。您将首先使用抽象方法创建一个类,该方法最终将提供依赖项实例:
abstract class MyClient implements Client {
void businessMethod(…) {
Dependency dependency = getDependencyInstance();
…
}
abstract Dependency getDependencyInstance();
}
现在,您继续为依赖项配置原型bean定义:
<bean id="dependency" class="….DependencyImpl" scope="prototype" />
客户端使用
lookup-method
元素始终为每个方法调用获取依赖项的新实例:<bean class="….MyClient">
<lookup-method name="getDependencyInstance" bean="dependency" />
</bean>
这将导致为
MyClient
创建CGLib代理,并由getDependencyInstance(…)
支持TargetSource
的方法声明,并引用BeanFactory
和要查找的bean名称。在每次方法调用时,将触发Bean查找,并返回原型配置的Bean的新实例。