Spring переменная количество экземпляров - PullRequest
3 голосов
/ 27 июля 2011

Я вхожу в Spring сейчас, и у меня есть вопрос.Давайте предположим, что у нас есть интерфейс IControl, и у нас есть три его реализации - например, Button, Label, Checkbox.Пользователь будет вводить число N во время выполнения, и я должен создать N элементы управления определенного типа (Button, Label или Checkbox).Проблема в том, что я хочу, чтобы этот конкретный тип был настроен до запуска программы.Например, я настраиваю в своем spring.xml, что мне нужны кнопки, затем запускается программа, пользователь вводит 10, и я создаю 10 кнопки.

<beans>
   <bean id="controlCreator" class="org.company.ControlCreator">
       <property name="controlType" ref="?!?!?!?!?!?!"/>
   </bean>   
</beans>

Как мне настроить это?

PS Это только обучающий пример, который я составил.

С наилучшими пожеланиями, Петар

Ответы [ 2 ]

4 голосов
/ 27 июля 2011

Прежде всего, позвольте мне заявить, что Spring не предназначен для этого.Spring хочет ненавязчивый метод соединения ваших компонентов.Он не предназначен для использования при порождении объектов во время выполнения.

Правильный подход

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

Навязчивое apporach

Если вы действительно хотите использовать Spring, вы можете сделать это навязчиво, спросивapplicationContext для экземпляра вашего элемента управления.

По умолчанию все компоненты Spring являются синглетонами, но вы можете превратить их в прототипы.

Отказ от ответственности: код не проверен, но должен выглядеть примерно так:

Applicationcontext.xml

<beans>
   <bean id="myButton" class="org.company.Control" scope="prototype">
       <property name="controlType" value="button" />
   </bean>   

   <bean id="controlCreator" class="org.company.ControlCreator" scope="singleton">
   </bean>   

</beans>

Код

public class controlCreator implements ApplicationContextAware {

  private ApplicationContext appContext;

  public Control createButton(){
    // since this bean is prototype, a new one will be created like this
    return getApplicationContext().getBean("myButton");
  }


  // ... getter and setter for applicationContext

}

Ненавязчивый подход

Если вы действительно хотите использовать Spring, и вы действительно хотите использовать его ненавязчиво, вам придется использовать Метод Injection .Добавьте фабричный метод в ваш класс.

Код будет следующим:

Applicationcontext.xml

<beans>
   <bean id="myButton" class="org.company.Control" scope="prototype">
       <property name="controlType" value="button" />
   </bean>   

   <bean id="controlCreator" class="org.company.ControlCreator" scope="singleton">
       <lookup-method bean="myButton" name="createButton"/>
   </bean>   

</beans>

Код

public class controlCreator implements ApplicationContextAware {

  private ApplicationContext appContext;

  public abstract Control createButton();


  // ... getter and setter for applicationContext

}

Возвращает компонент при вызове метода поиска.Поскольку бин является прототипом, он создаст новый.

1 голос
/ 27 июля 2011

Вы не можете создать N экземпляров одного и того же bean-компонента, так как bean-компоненты являются синглетонами, и ref должен ссылаться на этот синглтон bean-компонента.

Что вы можете сделать, это сделать controlCreator abstract и затем сконфигурировать с другимреализации, которые создают различные элементы управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...