2011-04-13 132 views
6

我有一種情況,我想通過工廠對象動態創建一個對象,但該對象需要通過spring上下文創建,以允許自動裝配依賴項。我知道還有很多其他的方法可以解決這個問題 - 例如使用服務定位器模式 - 但是如果可能的話,我想這樣做。使用實例工廠方法動態創建原型bean

想象我有兩個對象:

class OuterObject { 
    List<InnerObjectInterface> innerObjs; 
    ... 
} 
class InnerObject implements InnerObjectInterface{ 
    @Autowired 
    SomeDependency someDependency; 
    ... 
} 

我想創建一個工廠,做的東西沿着線:

class OuterObjectFactory { 
    private innerObject = new InnerObject(); 

    public OuterObject construct(params){ 
     OuterObject o = new OuterObject(); 
     List<InnerObjectInterface> inners = new ArrayList<InnerObjectInterface>(); 
     ... 
     for(some dynamic condition){ 
      ... 
      inners.add(createInnerObject()); 
      ... 
     } 
    } 
    public createInnerObject(){ 
     return innerObject; 
    } 
} 

我春天的context.xml會看起來類似:

<bean id="outerObjectFactory" class="path.OuterObjectFactory" /> 
<bean id="innerObject" class="path.InnerObject" factory-bean="outerObjectFactory" factory-method="createInnerObject" /> 

但是,這是行不通的。只有一個innerObject是創建的,我希望它的行爲就像scope =「prototype」。如果我將scope =「prototype」添加到bean定義中:

<bean id="innerObject" class="path.InnerObject" factory-bean="outerObjectFactory" factory-method="createInnerObject" scope="prototype"/> 

然後它似乎創建了許多innerObjects,但它們沒有正確接線。我的同事相信,找到here的文檔意味着工廠bean只用於初始化一個bean,但我不覺得那麼明顯。

如果有人能夠理解我的理解,並且可能甚至建議使用佈線建模工廠模式的更好方法,那麼我會很感激。

謝謝!

回答

2

我想你所說的是,你有一個工廠是一個單身人士,你希望它創建一個新的對象,每次你想要一個新的對象完全依賴注入。這樣做的舊方法是您連接到上面的方法注入。新的(也可以說是更乾淨的方式)是使用Scoped Proxy。您可以使用annotationsregular config,但想法是您在bean周圍創建代理(例如InnerObject)。當你需要引用它時,spring會自動爲你提供一個插入了相應依賴的新副本。

+1

事實證明,這實際上並不適用於原型bean。然而,它確實讓我接受了方法注入,它解決了這個問題 - 不是很乾淨,但仍然很好。感謝麪糰 – idbentley 2011-04-14 18:29:56