Прежде всего, позвольте мне заявить, что 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
}
Возвращает компонент при вызове метода поиска.Поскольку бин является прототипом, он создаст новый.