2012-06-15 144 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的一個實例,除非否則它們也被定義爲原型