我可以直接在单例bean中自动装配原型bean吗?

时间:2015-03-21 19:52:23

标签: spring spring-mvc

我正在查看一些遗留代码并发现这里有一个singelton bean说X和我在其中自动装配原型bean,如:

@Controller
public class X {
  @Autowired
  private Y y;
  // ....
}

Y定义为:

@Component
@scope("prototype")
public class Y {

}

根据我的理解,在singelton bean中注入原型bean我们有两种方法

  1. 范围代理
  2. 方法注入
  3. 现在在上面的代码中没有使用上述方法。所以我会相信虽然原型bean是在X类中注入的,但它仍然表现为singelton bean,在整个应用程序范围内,只有单个Y实例可以在X类中使用吗?

2 个答案:

答案 0 :(得分:0)

在这种情况下,如果没有代理(查找方法注入),X将有一个Y的单个实例,它不会在X方法的调用之间发生变化(创建Y的实例并且当应用程序上下文构造X时,自动装入X.如果另一个Z类自动将Y自动装入,它也会获得自己的实例(不与X共享)。因为Y被声明为原型(每次从应用程序上下文请求Y的实例时,都会创建一个新实例)。

有关更多信息,请参阅示例Spring IoC容器文档5.5.2和5.5.3:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-scopes-prototype

答案 1 :(得分:0)

是。每次从上下文获取时,原型bean都会创建新实例。 在这种情况下,Spring创建单例(类X)ant然后从上下文获取类型为Y的bean以将其注入X.这将在应用程序的生命周期中仅发生一次。因此,在X中注入的Y实例将与X一样长。