0

我有一堂课如下。

public class MyClass {


  public void doSomething(){
      //B b = //some how get new instance of B each time when doSomething is called
      //do it now
   }


}

春天是否提供了一些内置的东西?或者我必须自己创建一个工厂,每次调用工厂的get方法时都会创建并返回B?

4

1 回答 1

0

这是可能的,并记录在手册中

在大多数应用场景中,容器中的大多数 bean 都是单例的。当一个单例 bean 需要与另一个单例 bean 协作,或者一个非单例 bean 需要与另一个非单例 bean 协作时,您通常通过将一个 bean 定义为另一个 bean 的属性来处理依赖关系。当 bean 生命周期不同时,就会出现问题。假设单例 bean A 需要使用非单例(原型)bean B,可能在 A 上的每个方法调用上。容器只创建单例 bean A 一次,因此只有一次设置属性的机会。容器无法在每次需要时为 bean A 提供一个新的 bean B 实例。

一个解决方案是放弃一些控制反转。您可以通过实现 ApplicationContextAware 接口让 bean A 了解容器,并在每次 bean A 需要时对容器进行 getBean("B") 调用来请求(通常是新的)bean B 实例。

[...]

查找方法注入是容器覆盖容器托管 bean 上的方法的能力,以返回容器中另一个命名 bean 的查找结果。查找通常涉及原型 bean,如上一节中描述的场景中那样。Spring 框架通过使用 CGLIB 库中的字节码生成来动态生成覆盖该方法的子类来实现此方法注入。

于 2013-07-02T18:58:57.943 回答