我有一个例子。
<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实例,但我总是返回相同的单例实例。还有一种情况是aDependency
和bDependency
可能会在内部再次引用其他bean。
现在我有一个问题,比如我如何获得一个新的xyzService实例。我做错了吗?
答案 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>
然后,您应该能够验证xyzService
和useService1
的{{1}}属性是否包含useService2
的不同实例。这就是将xyzService
声明为原型的效果。如果你真的希望在xyzService
bean的生命周期中有xyzService
bean的新实例可用,我认为你需要一个不同的方法 - 看一下{{3}的文档}。
答案 3 :(得分:0)
在您的示例中,每次向spring容器请求 userService 的实例时,它都将返回单例实例并注入 xyzService 的新实例。
但是,当spring创建 xyzService 的新实例时,它将使用 aDependency 和 bDependency 的单例实例,除非它们也是定义为原型。