1

例如,我有一个场景。

<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 实例,但我总是返回相同的单例实例。还有一种情况是aDependencyandbDependency可能在内部再次对其他 bean 有更多引用。

现在我有一个问题,例如如何获得 xyzService 的新实例。难道我做错了什么?

4

4 回答 4

1

默认spring bean的作用域是singleton,你需要标记作用域prototype来指示spring

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

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


于 2012-06-15T05:49:04.017 回答
0

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

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();
}
于 2012-06-15T11:37:04.040 回答
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>

然后,您应该能够验证 和 的属性xyzService是否包含不同的. 这就是声明范围为原型的效果。如果您真的希望 bean 的新实例在bean 的生命周期内可用,我认为您需要一种不同的方法 - 查看Method injection的文档。useService1useService2xyzServicexyzServicexyzServiceuseService

于 2012-06-15T15:04:05.317 回答
0

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

However, when spring creates a new instance of xyzService, it will use the singleton instance of aDependency and bDependency unless otherwise they are also defined as prototype.

于 2012-06-16T02:30:17.113 回答