Spring bean的执行范围

时间:2012-06-15 05:44:27

标签: java spring java-ee dependency-injection ioc-container

我有一个例子。

<bean id="xyzService" class="XyzServiceImpl" scope="prototype">
    <property name="aDependency" ref="aDependency" />
    <property name="bDependency" ref="bDependency" />
</bean>

<bean id="useService" class="UseServiceImpl">
    <property name="xyzService" ref="xyzService"/>
</bean>

Java类:

public class XyzServiceImpl implements XyzService{
     private ADependency aDependency= null;
   private BDependency bDependency= null;
   // getters and setters...
}

 public class UseServiceImpl implements UseService {
     private XyzService xyzService= null;
 // getters and setters...
    xyzService.doSomething();
}

现在每次在UseServiceImpl中我都期待一个新的xyzService实例,但我总是返回相同的单例实例。还有一种情况是aDependencybDependency可能会在内部再次引用其他bean。

现在我有一个问题,比如我如何获得一个新的xyzService实例。我做错了吗?

4 个答案:

答案 0 :(得分:1)

默认情况下,spring bean的范围为singleton,您需要标记范围prototype以指示spring

<bean id="beanId" class="some.class.Name" scope="prototype"/>

Spring将在Bean的每个请求上创建新实例


参见

答案 1 :(得分:0)

我可以通过实现具有上下文的getter和setter方法的ApplicationContextAware接口轻松找到解决方案。从上下文我可以说getBean并获取新的Instance

public class UseServiceImpl implements UseService,ApplicationContextAware {
     private ApplicationContext context;
     XyzService xyzService= context.getBean(XyzServiceImpl.class);
   // getter and setter for applicationContext
     private XyzService xyzService= null;
   // getters and setters...
    xyzService.doSomething();
}

答案 2 :(得分:0)

如果您有以下内容:

<bean id="xyzService" class="XyzServiceImpl" scope="prototype">
    <property name="aDependency" ref="aDependency" />
    <property name="bDependency" ref="bDependency" />
</bean>

<bean id="useService1" class="UseServiceImpl">
    <property name="xyzService" ref="xyzService"/>
</bean>

<bean id="useService2" class="UseServiceImpl">
    <property name="xyzService" ref="xyzService"/>
</bean>

然后,您应该能够验证xyzServiceuseService1的{​​{1}}属性是否包含useService2的不同实例。这就是将xyzService声明为原型的效果。如果你真的希望在xyzService bean的生命周期中有xyzService bean的新实例可用,我认为你需要一个不同的方法 - 看一下{{3}的文档}。

答案 3 :(得分:0)

在您的示例中,每次向spring容器请求 userService 的实例时,它都将返回单例实例并注入 xyzService 的新实例。

但是,当spring创建 xyzService 的新实例时,它将使用 aDependency bDependency 的单例实例,除非它们也是定义为原型