Как мне получить доступ к свойству через ApplicationContext

#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 есть метод доступа для этого, посмотрите здесь:

http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/beans/factory/config/PropertyResourceConfigurer.html#convertPropertyValue(java.lang.Строка)

Комментарии:

1. Это не «метод доступа». Это внутренний метод с защищенной видимостью для расширения — определенно не для использования таким образом.