ВЕСНА: Как вы программно создаете экземпляры классов на основе информации, передаваемой из Flex UI - PullRequest
1 голос
/ 28 февраля 2010

Представьте, что пользовательский интерфейс передает узел XMl следующим образом:

<properties>
<type> Source </type>
<name> Blooper </name>
<delay>
    <type> Deterministic </type>
    <parameters>
       <param>  4 </param>
    </parameters>
<delay>
<batch>
    <type> Erlang </type>
    <parameters>
       <param>  4 </param>
        <param>  6 </param>
    </parameters>
<batch>

И за сценой, что он требует, чтобы вы создали экземпляр класса как таковой:

new Source("blooper", new Exp(4), new Erlang(4,6);

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

Я слышал, что может быть полезным использование BeanFactoryPostProcessor или редактора / конвертера свойств.Однако я не знаю, как лучше всего использовать их для решения моей проблемы.

Любая помощь, которую вы можете оказать, будет высоко оценена.

Ответы [ 3 ]

2 голосов
/ 01 марта 2010

В вашем вопросе я не могу найти ссылку на пружину, поэтому напишу беспружинное решение. Если у вас есть какая-то пружинная интеграция, о которой вы не упомянули, пожалуйста, поделитесь.

Class<?> clazz = Class.forName(type);
return type.newInstance(); // returns a new instance of the specified type

У вас есть два условия:

  • type должен быть полностью квалифицирован - т.е. com.foo.bar.MyType. Если это не так, вам нужно как-то конвертировать его заранее
  • класс должен иметь конструктор по умолчанию (без аргументов).

Затем, если вы хотите, чтобы эти классы автоматически связывали свои зависимости в контексте Spring, вы можете сделать это с помощью:

WebApplicationContextUtils.getRequiredWebApplicationContext()
     .getAutowireCapableBeanFactory().autowire(..);

(или autowireBean). Если вы используете тот, который принимает аргумент Class, вы должны определить bean-компоненты перед прототипом области видимости. В противном случае вы просто создаете их экземпляры и позволяете Spring вставлять их зависимости без предварительной настройки.

1 голос
/ 28 февраля 2010

если все классы загружены в контекст Spring (что означает, что они создаются), вы можете написать фабрику, реализующую BeanFactoryAware, и получить нужные вам классы, вызывая BeanFactory.getBean ("beanId").

конфиг

<bean id="randomIntArrayGenerator" class="com.mirror.exp.RandomIntArrayGenerator">
    <constructor-arg index="0" value="10"/>
</bean>

<bean id="arrayGeneratorFactory" class="com.mirror.exp.ArrayGeneratorFactory"/>

класс

public class ArrayGeneratorFactory implements BeanFactoryAware {

private BeanFactory _context;

public ArrayGenerator getGenerator(String type) {
    ArrayGenerator generator = null;
    if ("int".equals(type))
        generator = (ArrayGenerator) _context.getBean("randomIntArrayGenerator");
    return generator;
}

public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
    _context = beanFactory;
}

}

0 голосов
/ 14 марта 2010

Castor позволяет отображать XML на объекты Java, а XSLT позволяет настраивать XML-интерфейс в соответствии с тем, что ожидает Castor

Спасибо за все советы и подсказки, ребята!

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