Применение динамических свойств к бину во время выполнения - PullRequest
5 голосов
/ 05 января 2010

Предположим, у меня есть компонент DialogBox, со свойствами для высоты и ширины:

public class DialogBox {
 int x;
 int y;
 ...
}

В моем applicationContext.xml я определил бы свойства как разумные значения по умолчанию:

<bean id="dialogbox" class="DialogBox">
  <property name="x" value="100"/>
  <property name="y" value="100"/>
</bean>

У нас есть несколько клиентов, которые используют bean-компонент dialogBox, и каждый хочет получить пользовательское значение для x и y. Один из обсуждаемых нами путей состоит в том, чтобы иметь несколько файлов свойств, по одному для каждого клиента, и сопоставить идентификатор клиента с соответствующим файлом, например, клиент 123 будет отображаться в dialogbox_123.properties:

dialogbox_123.properties:
x=200
y=400

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

Ответы [ 3 ]

4 голосов
/ 06 января 2010
  1. Используйте FactoryBean (как уже предлагалось) для настройки экземпляров.
  2. установить scope="prototype" в bean-компоненте, чтобы каждый раз, когда требуется экземпляр, создавался новый.
  3. Если вы хотите внедрить компонент prototype в компонент singleton, используйте lookup-method ( Поиск по методу поиска здесь )

Я не уверен, что это подойдет для вашего случая. Другое предложение будет:

В @PostConstruct методы ваших различных «клиентов» устанавливают свойства по желанию в уже введенном диалоговом окне. Как:

public class MyDialogClient {
    @Autowired
    private Dialog dialog;

    @PostConstruct
    public void init() {
        dialog.setWidth(150); //or read from properties file
        dialog.setHeight(200);
    }
    ...
}

Опять же, в этом случае вы можете играть с атрибутом scope.

2 голосов
/ 06 января 2010

Взгляните на Spring OSGi Compendium services , у них есть менеджер свойств, называемый «managed-properties», который позволяет вам не только обновлять свойства во время выполнения, но и в то время, когда приложение работает, если вы выберете стратегию обновления, управляемую контейнером.

0 голосов
/ 05 января 2010

Если я понял вопрос, вы можете использовать FactoryBean для настройки логики создания бина в Spring.

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