2010-01-05 5 views
4

Предположим, у меня есть фасоль 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> 

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

dialogbox_123.properties: 
x=200 
y=400 

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

+0

См. Также http://stackoverflow.com/questions/534030/reloading-refreshing-spring-configuration-file-without-restarting-the-servlet-co – Vadzim

ответ

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

Я не уверен, если это будет соответствовать вашему случаю, хотя. Еще одно предложение:

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

public class MyDialogClient { 
    @Autowired 
    private Dialog dialog; 

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

Снова, в этом случае, вы можете играть с scope atrribute.

0

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

+0

Спасибо за ваш ответ. Я уточнил, чего именно мы пытаемся достичь. Это имеет смысл? –

+0

Вы хотите сказать, что каждый клиент получает свой собственный экземпляр dialogBox со своими собственными значениями свойств, правильно? И как вы определяете, какой клиент запрашивает диалоговое окно для применения пользовательских значений? – axtavt

+0

Когда я обращался к клиенту, я имел в виду клиента с несколькими арендаторами, который можно было искать, например, в переменной с областью действия, поэтому каждый арендатор или «клиент» мог иметь свои собственные пользовательские свойства –

2

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

Смежные вопросы