2011-04-13 60 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

相关问题