如何在Spring中使用Factory + AOP

Jen*_*der 5 java aop spring factory

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

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

  • 只需使用new创建X. 这工作了一段时间,但现在我们需要X的Spring AOP功能,所以这不再起作用了,因为生成的实例不是Spring管理的.

  • 我认为FactoryBean是一个依赖项,但我只从FactoryBean获得一个X实例,它不符合我的第一个实例.

  • 当前的计划是在Spring上下文中手动查找X,并在那里使用原型依赖项声明它.这应该有效,但我认为这真的很难看.

=>如何在我的bean中注入一个工厂,以便我可以在任何时候调用它的工厂方法,并从中获取一个spring托管实例.

Oli*_*ohm 12

像这样的场景的选择方法称为查找方法注入.简而言之,这使用了对bean方法的调用方法,从而导致创建了一个新的bean实例.您首先要创建一个带有抽象方法的类,该方法最终将提供依赖项实例:

abstract class MyClient implements Client {

  void businessMethod(…) {

    Dependency dependency = getDependencyInstance();
    …
  }

  abstract Dependency getDependencyInstance();
}
Run Code Online (Sandbox Code Playgroud)

您现在继续为依赖项配置原型bean定义:

<bean id="dependency" class="….DependencyImpl" scope="prototype" />
Run Code Online (Sandbox Code Playgroud)

以及使用该lookup-method元素的客户端总是为每个方法调用获取一个新的依赖实例:

<bean class="….MyClient">
  <lookup-method name="getDependencyInstance" bean="dependency" />
</bean>
Run Code Online (Sandbox Code Playgroud)

这将导致为一个CGLib代理创建,MyClient并且该方法声明getDependencyInstance(…)由a支持,TargetSource并引用BeanFactory要查找的bean和名称.在每次方法调用时,将触发bean查找并返回原型配置bean的新实例.