我有一种情况,我想通过工厂对象动态创建一个对象,但是需要通过spring上下文创建对象,以允许自动装配依赖项。我知道有很多其他方法可以解决这个问题 - 例如使用服务定位器模式 - 但是如果可能的话我想这样做。
想象一下,我有两个对象:
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;
}
}
我的spring-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"/>
然后它似乎创建了许多内部对象,但它们没有正确连线。我的同事认为发现here的文档暗示工厂bean只用于初始化bean,但我没有发现那么明显。
如果有人能在这里澄清我的理解,我会很感激,甚至可能会建议一种更好的方法来建模工厂模式,而不是我正在做的工作。
谢谢!
答案 0 :(得分:2)
我认为你所说的是你有一个工厂,它是一个单身,你希望它创建新的对象,每次你想要一个新的对象完全依赖注入。旧方法是您在上面链接的方法注入。新的(可以说更清晰的方式)是使用Scoped Proxy。您可以使用annotations或regular config但想法是围绕bean创建代理(例如InnerObject)。当你需要引用它时,spring会自动为你提供一个插入了相应依赖项的新副本。