我有一个单例Spring bean(它必须保持一个单例),每次执行某个方法时,它需要另一个bean(称为X)的新实例。

到目前为止,我研究了以下方法:

  • 仅使用new创建X。这工作了一段时间,但是现在我们需要X的Spring AOP功能,因此不再起作用,因为生成的实例不受Spring管理。
  • 我认为FactoryBean是一个依赖项,但是我只能从FactoryBean中获得一个X实例,而这与我的第一个实例不符。
  • 当前的计划是在Spring上下文中手动查找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的新实例。

    07-24 09:46
    查看更多