#java #spring
#java #spring
Вопрос:
Когда файл свойств используется в Spring ApplicationContext, к его свойствам можно получить доступ следующим образом: $ {someproperty} внутри ваших файлов конфигурации xml. Но как получить доступ к тому же свойству в вашем java-коде, не вводя его через xml?
Конфигурация ApplicationContext
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="myapp.properties" />
</bean>
<bean class="my.app.MyClass">
<property name="foo" value="${someproperty}" />
</bean>
</beans>
Свойства
someproperty=somevalue
Обновление 1
Фактический смысл этого — это особый случай, когда в файле свойств задается уникальный идентификатор для приложения (редактирование ez системным администратором). Несколько классов приложений реализуют ApplicationContextAware, поэтому у них есть доступ к контексту, и чтобы предотвратить внедрение в каждый класс или определение компонента для каждого класса, нам нужен метод доступа к свойству ez. Наше приложение, «знающее» о Spring, в этом случае не является проблемой.
Комментарии:
1. Не могли бы вы объяснить «запретить внедрение в каждый класс или определение компонента для каждого класса», пожалуйста?
2. Если мы не используем аннотации, для каждого компонента, требующего доступа к самому свойству, будет ожидаться тег «property». Он просто переносит работу из класса в xml.
3. На самом деле я склоняюсь к использованию класса конфигурации, подобного тому, который приведен в этом сообщении в блоге: chrislovecnm.com/2010/03/08 /…
Ответ №1:
Нет никакого смысла обращаться к свойству, это противоречит принципу IoC, основной цели Spring. В дополнение к другим ответам, может быть, вам нужны все свойства? В этом случае существует PropertiesFactoryBean
объект, который может предоставить вам Properties
объект для доступа ко всем свойствам.
PropertyPlaceholderConfigurer
Компонент предназначен для замены заполнителей в контексте spring. Любые другие способы использования, по крайней мере, сбивают с толку.
Ответ №2:
В хорошем стиле ваш код знает как можно меньше о Spring, но вы можете ввести его через @Value
аннотацию (при условии, что вы используете Spring 3), которую вы помещаете в свойство или конструктор (в зависимости от того, как вы создаете свой компонент). В противном случае вы можете выбрать его из конфигурации веб-приложения, но, по моему опыту, это значительно более подвержено ошибкам. (Другая хорошая вещь в том, чтобы делать это с Spring, заключается в том, что она упрощает объединение свойств из нескольких разных источников со сложными правилами переопределения. Выполнение этого вручную является болезненным.)
Комментарии:
1. Это выглядит многообещающе, и да, мы используем Spring 3
Ответ №3:
Я бы извлек placeHolderConfig
компонент (например, из ApplicationContext или путем его ввода), у PropertyPlaceholderConfigurer есть метод доступа для этого, посмотрите здесь:
Комментарии:
1. Это не «метод доступа». Это внутренний метод с защищенной видимостью для расширения — определенно не для использования таким образом.