Требуется PropertyPlaceholderConfigurer . Этот раздел руководства демонстрирует это лучше, чем я мог на месте.
В вашем примере вам необходимо либо изменить значение свойства на class1
, либо class2
(имя нужного компонента в контексте весны).
Альтернативно, ваша конфигурация может быть:
<bean id="mainView"
class="mainView">
<property name="angebotsClient" ref="angebotsClient" />
<property name="class">
<bean class="${classToUse}">
<constructor-arg ref="mainView"/>
</bean>
</property>
</bean>
с файлом конфигурации, содержащим:
classToUse = fully.qualified.name.of.some.Class
Использование имен бинов или классов недопустимо в редактируемом пользователем файле конфигурации, и вам действительно нужно использовать «Y» и «N» в качестве значений параметров конфигурации. В этом случае вам просто нужно будет сделать это на Java, Spring не предназначен для полного тестирования.
mainView может напрямую обращаться к контексту приложения:
if (this.withSmartCards) {
this.class_ = context.getBean("class1");
} else {
this.class_ = context.getBean("class2");
}
Более чистое решение заключалось бы в инкапсуляции обработки пользовательской конфигурации в своем собственном классе, которая выполняла бы вышеописанное, чтобы уменьшить количество классов, которые должны быть ApplicationContextAware, и внедрять их в другие классы по мере необходимости.
Используя BeanFactoryPostProcessor , вы можете зарегистрировать определение свойства класса программно. Используя FactoryBean , вы можете динамически создавать бин. Оба - несколько продвинутые способы использования Spring.
В сторону: я не уверен, допустим ли ваш пример конфигурации, учитывая циклическую зависимость между mainView и class1 / class2.