Получение значения конфигурации пружины из пользовательского класса - PullRequest
1 голос
/ 13 апреля 2009

Я собираюсь использовать Spring для сборки компонентов моего приложения, но у меня есть проблема. Наше приложение использует хранилище конфигурации, которое является глобальным для ВМ и аналогично (но не точно) системным свойствам.

Доступ к этому API конфигурации осуществляется следующим образом:

Configuration.getDb ().get ("some_property_name")

Есть ли способ использовать значения из этой глобальной конфигурации в файлах bean-компонентов Spring? getDb может возвращать другое значение в зависимости от текущего состояния библиотеки конфигурации (у нее есть контекст), но я хочу сделать заявление, что конфигурация Spring будет полностью загружена во время инициализации контекста приложения. Тем не менее, что-то более гибкое было бы фантастическим.

Учитывая, что я новичок в Spring, примеры кода сделают мою жизнь намного проще.

Ответы [ 3 ]

3 голосов
/ 13 апреля 2009

Вы можете сделать это, хотя это не рекомендуемый метод обработки данных конфигурации. См. 3.7 Точки расширения контейнера в справочной документации Spring.

По сути, вам нужно создать собственную реализацию BeanFactoryPostProcessor, которая заменит выражение вроде:

${some_property_name}

с соответствующим значением на основе обратного вызова.

Посмотрите на реализацию PropertyPlaceholderConfigurer в качестве отправной точки.

1 голос
/ 17 апреля 2009

Чтобы подробнее рассказать о предложении cletus, я бы сказал, что вам нужен собственный подкласс PropertyPlaceholderConfigurer, и переопределите метод resolPlaceholder (), который вызовет ваш код Configuration.getDb (). Если вы не можете разрешить значение, делегируйте его обратно суперклассу.

Например:

public class MyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
    @Override
    protected String resolvePlaceholder(String placeholder, Properties props) {
        String value = Configuration.getDb().get(placeholder)
        if (value == null) {
            value = super.resolvePlaceholder(placeholder, props);
        }
        return value;
    }
}

Затем просто определите bean-компонент типа MyPlaceholderConfigurer в контексте вашего приложения, и Spring автоматически проведет консультации с вашим классом для определения значений заполнителей.

Если ваш компонент Configuration.getDb () не может разрешить значение, то делегирование обратно суперклассу позволяет Spring вместо этого искать значение как системное свойство. Кроме того, вы можете добавить файл свойств в компонент, и он также может это проверить.

Прочтите справочные документы по основному использованию PropertyPlaceholderConfigurer, чтобы понять, как он работает. Это довольно гибкий.

0 голосов
/ 30 апреля 2009

Вы можете сделать это в конфигурации полностью (я не говорю, что это действительно красиво;):

<bean id="database" class="com.acme.Configuration" factory-method="getDb" />

<bean class="com.acme.YourHost">
  <property name="yourProperty">
    <bean factory-bean="database" factory-method="get">
      <constructor-arg value="some_property_name" />
    </bean>
  </property>
</bean>

Glad Spring 3.0 будет содержать язык выражений для таких случаев (см. сообщение в блоге ):).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...