Создать определение bean-компонента Spring из объекта Java - PullRequest
3 голосов
/ 02 июня 2010

Давайте предположим, что у меня есть бин, определенный весной:

<bean id="neatBean" class="com..." abstract="true">...</bean>

Тогда у нас много клиентов, каждый из которых имеет немного отличную конфигурацию для своего 'neatBean'. Старый способ, которым мы делали это, состоял в том, чтобы иметь новый файл для каждого клиента (например, clientX_NeatFeature.xml), который содержал кучу bean-компонентов для этого клиента (они отредактированы вручную и являются частью базы кода):

<bean id="clientXNeatBean" parent="neatBean">
    <property id="whatever" value="something"/>
</bean>

Теперь я хочу, чтобы у меня был пользовательский интерфейс, в котором мы могли бы редактировать и переопределять аккуратные элементы клиента на лету.

У меня такой вопрос: учитывая neatBean и пользовательский интерфейс, который может «переопределять» свойства этого bean-компонента, какой будет простой способ сериализации этого в файл XML, как мы это делаем [вручную] сегодня?

Например, если пользователь установил для клиента Y любое свойство, равное 17, я бы хотел сгенерировать:

<bean id="clientYNeatBean" parent="neatBean">
    <property id="whatever" value="17"/>
</bean>

Обратите внимание, что перемещение этой конфигурации в другой формат (например, база данных, other-schema'd-xml) является опцией, но на самом деле не является ответом на рассматриваемый вопрос.

Ответы [ 6 ]

7 голосов
/ 07 июня 2010

Вы можете скачать Spring-beans 2.5 xsd из здесь и запустить на нем xjc , чтобы сгенерировать классы Java с привязками JAXB. Затем вы можете создать иерархию объектов Spring-beans во время выполнения (и манипулировать ею по своему усмотрению), а затем сериализовать ее в XML-строку, используя Marshaller JAXB, как показано в answer .

Паблоджима
3 голосов
/ 10 июня 2010

Если вы хотите простое в реализации, а не рабочее решение, вы можете посмотреть на поддержку IDE, предоставленную в IntelliJ и Eclipse (The Spring Tool Suite).

Они анализируют все файлы bean-компонентов (вы можете настроить, какой набор) и проверять код Java, чтобы узнать, какие классы существуют, какие свойства в этих классах. Везде, где вы можете использовать Ctrl-Space, чтобы помочь с параметрами, и т.д ...

Я полагаю, что вы можете настроить «проекты» без Java-кода и только конфигурационные файлы Spring, чтобы уменьшить кривую обучения персонала, который должен вносить эти изменения.

2 голосов
/ 11 июня 2010

Очевидно, что вам нужна фабрика для ваших аккуратных бобов.

В Spring вместо объявления bean-компонента вы можете объявить FactoryBean, роль которого заключается в создании и настройке вашего окончательного bean-компонента. NeatBeanFactoryBean может считывать файл свойств (или конфигурацию xml), чтобы определить, как настроить созданные neatBeans, в зависимости от некоторого параметра времени выполнения (например, текущего clientID) или параметра времени компиляции (переменная среды).

2 голосов
/ 02 июня 2010

Я бы использовал Jax-b, чтобы сделать это. Вы создаете объект bean со списком объектов свойств внутри.

@XmlRootElement(name = "bean")
@XmlAccessorType(XmlAccessType.FIELD)

public class Bean {

  @XmlAttribute
  private String id;
  @XmlAttribute
  private String parent;

  @XmlElement(name="property")
  private List<BeanProperty> properties

Тогда вам также необходимо добавить аннотации к BeanProperty. Затем, когда у вас есть заполненный объект, просто перенесите его в xml, используя jaxb:

Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal( myBean, System.out );

Полные примеры кодов см .: http://java.sun.com/webservices/docs/2.0/tutorial/doc/JAXBUsing.html

В качестве альтернативы вы можете использовать Groovy - вы можете оставить его на месте, и создать этот xml очень просто ...

1 голос
/ 09 июня 2010

Я бы предложил использовать

<context:property-placeholder location="classpath*:clientX.properties"/>

и затем в вашем bean def:

<bean id="${clientYNeatBeanId}" parent="neatBean">
    <property id="whatever" value="${whateverValue}"/>
</bean>

Тогда для каждого клиента вы можете иметь clientX.properties, содержащий

whateverValue=17
whateverAnotherValue=SomeText
Файлы

.properties легче редактировать как вручную, так и программно с помощью java.util.Properties store(..) / save(..) методов

1 голос
/ 09 июня 2010

Чтобы добавить к двум другим вопросам, я считаю, что у Spring уже есть рабочая модель для определения bean-компонентов (см. Org.springframework.beans.factory.config.BeanDefinition); Вы можете основывать свою работу на этом.

...