У меня есть куча бобов Spring, которые взяты из classpath с помощью аннотаций, например
@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
// Implementation omitted
}
В XML-файле Spring определен PropertyPlaceholderConfigurer :
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="/WEB-INF/app.properties" />
</bean>
Я хочу внедрить одно из свойств из app.properites в bean-компонент, показанный выше. Я не могу просто сделать что-то вроде
<bean class="com.example.PersonDaoImpl">
<property name="maxResults" value="${results.max}"/>
</bean>
Потому что PersonDaoImpl не присутствует в XML-файле Spring (он выбирается из пути к классам с помощью аннотаций). Я получил, насколько следующее:
@Repository("personDao")
public class PersonDaoImpl extends AbstractDaoImpl implements PersonDao {
@Resource(name = "propertyConfigurer")
protected void setProperties(PropertyPlaceholderConfigurer ppc) {
// Now how do I access results.max?
}
}
Но мне не понятно, как я могу получить доступ к интересующей меня собственности ppc
?
PropertyPlaceholderConfigurer
больше не является рекомендуемым классом. ПредпочитаюPropertySourcesPlaceholderConfigurer
вместо. В любом случае вы можете использовать более короткое определение XML<context:property-placeholder />
.Ответы:
Вы можете сделать это весной 3, используя поддержку EL. Пример:
systemProperties
является неявным объектом иstrategyBean
является именем бина.Еще один пример, который работает, когда вы хотите получить свойство из
Properties
объекта. Это также показывает, что вы можете применять@Value
к полям:Вот сообщение в блоге, которое я написал об этом для немного большей информации.
источник
systemProperties
простоSystem.getProperties()
? Я предполагаю, что если я хочу внедрить свои собственные свойства в bean-компонент Spring, мне нужно определить и<bean id="appProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
затем прочитать значения из этого в другой bean-компонент, используя что-то вроде@Value("#{appProperties.databaseName}")
Лично я люблю этот новый способ в Spring 3.0 из документов :
Нет добытчиков или сеттеров!
Со свойствами, загружаемыми через конфиг:
В дальнейшем я могу даже контролировать щелчок по выражению EL в IntelliJ, и это приводит меня к определению свойства!
Также есть полностью не XML-версия :
источник
Существует новые аннотации
@Value
в Spring 3.0.0M3 .@Value
поддержка не только#{...}
выражений, но и${...}
заполнителейисточник
<context:property-placeholder ... />
является XML-эквивалентом PropertyPlaceholderConfigurer.Пример: applicationContext.xml
Класс компонента
источник
<context:component-scan base-package="com.company.package" />
Для справки, я использую пружину черезApplicationContext
, а не в веб-контексте.Другой альтернативой является добавление bean-компонента appProperties, показанного ниже:
При получении этот bean-компонент может быть приведен к
java.util.Properties
объекту, который будет содержать свойство с именем, изresults.max
которого читается значениеapp.properties
. Опять же, этот bean-компонент может быть внедрен зависимостью (как экземпляр java.util.Properties) в любой класс с помощью аннотации @Resource.Лично я предпочитаю это решение (другому, которое я предложил), так как вы можете точно ограничить, какие свойства предоставляются appProperties, и вам не нужно читать app.properties дважды.
источник
Мне нужно иметь два файла свойств, один для производства и переопределения для разработки (которые не будут развернуты).
Чтобы иметь оба, бин Properties, который может быть подключен автоматически, и PropertyConfigurer, вы можете написать:
и ссылка на Бин свойств в PropertyConfigurer
источник
Прежде чем мы получим Spring 3 - который позволяет вам вводить константы свойств непосредственно в ваши bean-компоненты с помощью аннотаций - я написал подкласс bean-компонента PropertyPlaceholderConfigurer, который делает то же самое. Таким образом, вы можете пометить ваши установщики свойств, и Spring автоматически соединит ваши свойства с вашими компонентами следующим образом:
Аннотация выглядит следующим образом:
PropertyAnnotationAndPlaceholderConfigurer выглядит следующим образом:
Не стесняйтесь изменить по вкусу
источник
Вы также можете комментировать свой класс:
И есть переменная, как это:
Теперь вы можете получить доступ ко всем своим свойствам следующим образом:
источник
Весенний путь:
private @Value("${propertyName}") String propertyField;
это новый способ ввести значение с помощью класса Spring «PropertyPlaceholderConfigurer». Другой способ - позвонить
Примечание. Для @Value нельзя использовать статическое свойство propertyField, оно должно быть только нестатическим, в противном случае возвращается значение null. Чтобы исправить это, для статического поля создается нестатический установщик, и над этим установщиком применяется @Value.
источник
Как упомянуто,
@Value
делает работу, и это довольно гибко, поскольку вы можете иметь пружинный EL в нем.Вот несколько примеров, которые могут быть полезны:
Еще один, чтобы получить
set
отlist
Вы также можете установить значения для примитивных типов.
Вы можете вызывать статические методы:
Вы можете иметь логику
источник
Возможным решением является объявление второго компонента, который читает из того же файла свойств:
Компонент с именем appProperties имеет тип java.util.Properties и может быть введен зависимостью с помощью атрибута @Resource, показанного выше.
источник
Если вы застряли в Spring 2.5, вы можете определить bean-компонент для каждого из ваших свойств и внедрить их с помощью квалификаторов. Как это:
и
Это не супер читаемый, но он выполняет свою работу.
источник
Значения автопроводки в Spring Beans:
Большинство людей знают, что вы можете использовать @Autowired, чтобы сказать Spring, чтобы он вставлял один объект в другой, когда он загружает контекст вашего приложения. Менее известный фрагмент информации заключается в том, что вы также можете использовать аннотацию @Value для вставки значений из файла свойств в атрибуты компонента. см. этот пост для получения дополнительной информации ...
новые вещи в Spring 3.0 || значения bean для автопроводки || значения свойств автопроводки весной
источник
Для меня это был ответ @ Lucky, а именно, строка
со страницы отладки капитана
это решило мою проблему. У меня есть приложение на основе ApplicationContext, запускаемое из командной строки и, судя по ряду комментариев к SO, Spring по-разному подключает их к приложениям на основе MVC.
источник
Я думаю, что наиболее удобный способ ввести свойства в bean-компонент - это метод setter.
Пример:
XML-определение бина:
Для каждого именованного
property
методаsetProperty(value)
будет вызван.Этот способ особенно полезен, если вам нужно более одного компонента на основе одной реализации.
Например, если мы определим еще один bean-компонент в xml:
Тогда код так:
Будет печатать
Итак, в вашем случае это должно выглядеть так:
источник
Если вам нужно больше гибкости для конфигураций, попробуйте Settings4jPlaceholderConfigurer: http://settings4j.sourceforge.net/currentrelease/configSpringPlaceholder.html
В нашем приложении мы используем:
Порядок по умолчанию, в котором ключ-значение-Источник проверяется первым, описан в:
http://settings4j.sourceforge.net/currentrelease/configDefault.html.
Его можно настроить с помощью settings4j.xml (с точностью до log4j.xml) в вашем CLASSPATH.
Дайте мне знать ваше мнение: settings4j-user@lists.sourceforge.net
с дружеским приветом,
Харальд
источник
Используйте класс Spring «PropertyPlaceholderConfigurer»
Простой пример, показывающий, что файл свойств читается динамически как свойство бина
Файл свойств
dev.app.jdbc.driver = com.mysql.jdbc.Driver
dev.app.jdbc.url = JDBC: MySQL: // локальный: 3306 / addvertisement
dev.app.jdbc.username = корень
dev.app.jdbc.password = корень
источник