使用实例工厂方法动态创建原型bean

idb*_*ley 6 java spring javabeans factory-pattern

我有一种情况,我想通过工厂对象动态创建一个对象,但需要通过spring上下文创建对象,以允许自动装配依赖项.我知道有很多其他方法可以解决这个问题 - 例如使用服务定位器模式 - 但是如果可能的话我想这样做.

想象一下,我有两个对象:

class OuterObject {
    List<InnerObjectInterface> innerObjs;
    ...
}
class InnerObject implements InnerObjectInterface{
    @Autowired
    SomeDependency someDependency;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个工厂,它可以完成以下工作:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的spring-context.xml看起来像:

<bean id="outerObjectFactory" class="path.OuterObjectFactory" />
<bean id="innerObject" class="path.InnerObject" factory-bean="outerObjectFactory" factory-method="createInnerObject" />
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用.只创建了一个innerObject,我希望它的行为类似于scope ="prototype".如果我将scope ="prototype"添加到bean定义中:

<bean id="innerObject" class="path.InnerObject" factory-bean="outerObjectFactory" factory-method="createInnerObject" scope="prototype"/>
Run Code Online (Sandbox Code Playgroud)

然后它似乎创建了许多innerObjects,但它们没有正确连线.我的同事认为,这里的文档暗示工厂bean只用于初始化bean,但我没有发现那么明显.

如果有人能在这里清理我的理解,我会很感激,甚至可能会建议一种更好的方法来建模工厂模式,而不是我正在做的.

谢谢!

dou*_*ugh 2

我认为你的意思是,你有一个单例工厂,你希望它创建新的对象,你每次都需要一个新的对象,并且完全依赖注入。旧的方法是方法注入,您可以在上面链接到该方法。新的(可以说是更干净的方法)是使用作用域代理。您可以使用注释常规配置,但想法是围绕 bean 创建一个代理(例如 InnerObject)。当您需要引用它时,spring 会自动为您提供一个插入了适当依赖项的新副本。