ОБНОВЛЕНО: сводную Постановление от 12/9/2016Установка имени класса Spring боба, используя выражение SPEL и PropertyPlaceHolder
Согласно @ altazar Ответим ниже, this is now possible от Spring 4.2!
Старый краткое постановление от 3/29/2012
По состоянию на эту дату, Spring SPEL не смог выполнить внутри class
атрибута <bean>
.
Оригинальный вопрос:
Я пытаюсь реализовать динамический class
атрибут для Spring бина, в конечном счете, установить, используя комбинацию PropertyPlaceHolder
собственности и выражение SPEL. Целью является либо выпускная, либо отладочная версия класса для создания экземпляра. Это не работает, и мне интересно, можно ли этого достичь.
До сих пор у меня есть следующие:
Плоские свойства файла:
is.debug.mode=false
Spring XML конфигурации:
<bean id="example"
class="#{ ${is.debug.mode} ?
com.springtest.ExampleDebug :
com.springtest.ExampleProd}"
/>
Spring самозагрузки Java код:
// Get basic ApplicationContext - DO NOT REFRESH
FileSystemXmlApplicationContext applicationContext = new
FileSystemXmlApplicationContext
(new String[] {pathSpringConfig}, false);
// Load properties
ResourceLoader resourceLoader = new DefaultResourceLoader();
Resource resource = resourceLoader.getResource("file:" + pathProperties);
Properties properties = new Properties();
properties.load(resource.getInputStream());
// Link to ApplicationContext
PropertyPlaceholderConfigurer propertyConfigurer =
new PropertyPlaceholderConfigurer() ;
propertyConfigurer.setProperties(properties) ;
applicationContext.addBeanFactoryPostProcessor(propertyConfigurer);
// Refresh - load beans
applicationContext.refresh();
// Done
Example example = (Example) applicationContext.getBean("example");
Сообщение об ошибке (с большим количеством пробелов удалены для ясности):
Caused by: java.lang.ClassNotFoundException:
#{ true ? com.springtest.ExampleDebug : com.springtest.ExampleProd}
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
. . .
Как вы можете видеть на «true
» в сообщении, is.debug.mode
свойство успешно загружен и заменен. Но что-то еще идет не так. Является ли это моей начальной загрузкой в Java? Или синтаксис SPeL в XML? Или другая проблема?
BTW Мне известно о новой функции профилей 3.1, но я хотел бы сделать это через SPeL по разным причинам. Также я понимаю, что я использую контекст и пути на основе файловой системы. У меня есть причины для этого.
+1 Это еще один хороший способ обхода проблемы. Вы говорите в основном, что оценка SPeL просто не происходит в атрибуте 'class'' '? –
Я думаю, что класс не обрабатывается через EL. Я смутно помню, как это проверялось в источниках. – mrembisz
Я доверяю вашей памяти об установке источника. Я просто получил одно и то же выражение SPeL для работы в '', но все еще не работает в ''. Это для меня подтверждение, и я иду с твоим ответом. –