2012-06-15 147 views
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的一个新实例,但我总是返回相同的单一实例。还有一种情况是aDependencybDependency可能会在内部再次引用一些其他bean的引用。

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

回答

0

我可以很容易找到通过实施ApplicationContextAware接口具有用于上下文中的获取和设置方法的解决方案。从上下文,我可以说的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(); 
} 
1

在春天bean的默认范围是singleton,你需要标记的范围prototype指示春天

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

春天将在bean的每个请求创建新实例


+0

如果你看到我的xyxService它被标记为原型。但我仍然得到相同的实例 – chaosguru

+0

你是如何检查你仍然得到相同的实例 –

+0

一种方法是我有一组值填充在一个应该不存在的新实例的依赖。而且我也可以记录Class总是相同的对象ID。 – chaosguru

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属性useService1useService2确实含有不同xyzService的实例。这就是宣称xyzService被限定为原型的效果。如果您真的想在useService bean的生命周期中使用xyzService bean的新实例,我认为您需要一种不同的方法 - 请参阅Method injection的文档。

0

在你的榜样,您每次请求spring容器userService的实例时,它会返回单一实例和注射xyzService的新实例。

然而,当春天创建的一个新实例xyzService,它将使用aDependencybDependency的一个实例,除非否则它们也被定义为原型