Использование метода фабрики экземпляров для динамического создания bean-компонентов - PullRequest
6 голосов
/ 14 апреля 2011

У меня есть ситуация, когда я хотел бы динамически создать объект через объект фабрики, но объект должен быть создан через контекст пружины, чтобы разрешить автоматическое связывание зависимостей.Я знаю, что есть много других способов решения этой проблемы - например, с помощью шаблона поиска служб - но я бы хотел сделать это, если это возможно.

Представьте, что у меня есть два объекта:

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".Если я добавлю область = «прототип» к определению компонента:

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

Затем создается впечатление, что создается много внутренних объектов, но они неправильно подключены.Мой коллега считает, что документация, найденная здесь , подразумевает, что фабричный компонент используется только для инициализации компонента, но я не нахожу это очевидным.

Я был бы признателен, если былюбой мог бы прояснить мое понимание здесь и, возможно, даже предложить лучший способ моделирования заводского образца с помощью проводки, чем то, что я делаю.

Спасибо!

1 Ответ

2 голосов
/ 14 апреля 2011

Я думаю, что вы говорите о том, что у вас есть фабрика, которая является одноэлементной, и вы хотите, чтобы она создавала новые объекты, для которых вы хотите новый каждый раз с полным внедрением зависимостей. Старый способ сделать это был метод инъекции, на который вы ссылаетесь выше. Новым (и, возможно, более чистым способом) является использование Scoped Proxy. Вы можете использовать аннотации или обычную конфигурацию , но идея в том, что вы создаете прокси вокруг компонента (например, InnerObject). Когда вам понадобится ссылка на него, Spring автоматически предоставит вам новую копию с соответствующими вставленными зависимостями.

...