Конфигурация Java и внедрение зависимостей (сродни IoC Springs против Weld / Guice) - PullRequest
3 голосов
/ 28 июля 2011

Допустим, у меня есть класс ListCreator, который я хочу настроить. Я хочу быть в состоянии сказать это порядок сортировки и как вывести мою таблицу. Поэтому у меня есть логическое свойство sortDescending и интерфейс TableWriter, который реализуется PdfTableWriter (но также XlsTableWriter). В этом примере я думаю, что конфигурация и DI идут рука об руку. Я хотел бы написать что-то вроде этого примера Spring (псевдо):

<beans>
    <bean id="ListCreator" class="ModularListCreator">
        <property name="tableWriter">
            <ref local="TableWriter"/>
        </property>
        <property name="sortDescending">
            <value>true</value>
        </property>
    </bean>
    <bean id="TableWriter" class="PdfTableWriter"> </bean>
</beans>

Теперь Spring может сделать это, но, похоже, Weld & Guice не может. Например, Weld позволяет вам выбирать альтернативы в beans.xml, но только для всего приложения. Что если я хочу иметь один ListCreator для файлов PDF и еще один для XLS одновременно?

В настоящий момент я не понимаю возможности Weld и Guice, так как они, кажется, не допускают большую часть конфигурации. Кажется, что это только облегчает необходимость писать new или создавать собственные фабрики. Например, EJB-инъекция делает то же самое, что хорошо, но где находится вся часть конфигурации (выбор экземпляра, с какими параметрами я на самом деле хочу, где).

Подходя к реальному моменту: я не хочу использовать Spring, так как он кажется чрезмерным. Я скорее использую что-то чистое и маленькое, в лучшем случае указанное JSR. Есть предложения?

Ответы [ 3 ]

0 голосов
/ 26 февраля 2012

Для CDI, проверьте припой.Он добавляет возможность легко настраивать управляемые компоненты из XML-файла.Судя по тесной взаимосвязи между командами Seam и Weld, этот механизм, вероятно, имеет хорошие шансы превратить его в будущую JSR.

0 голосов
/ 12 октября 2012

InPUT предлагает способ, если вы хотите гибкое решение на основе описания. Я создал весь пример и добавил его в раздел example .

Код минимален с:

Design config = new Design("config.xml");
ListCreator creator = config.getValue("ListCreator");

при условии, что у вас есть config.xml InPUT design , который содержит настройки в синтаксисе InPUT:

<SValue id="ListCreator">
    <NValue id="SortDescending" value="false"/>
    <SValue id="TableWriter" value="Xls"/>
</SValue>

Чтобы это работало, вы должны определить расчетное пространство следующим образом:

<SParam id="ListCreator">
    <NParam id="SortDescending" type="boolean" />
    <SParam id="TableWriter">
        <SChoice id="Xls"/>
        <SChoice id="Pdf"/>
    </SParam>
</SParam>

Теперь вы приспосабливаете пространство разработки, независимое от языка программирования, к вашей реализации Java в сопоставлении кода :

<Mapping id="ListCreator" type="test.ListCreator" constructor="TableWriter SortDescending"/>
<Mapping id="ListCreator.TableWriter" type="test.TableWriter"/>
<Mapping id="ListCreator.TableWriter.Xls" type="test.XlsTableWriter"/>
<Mapping id="ListCreator.TableWriter.Pdf" type="test.PdfTableWriter"/>

Отсюда расширяйте и настраивайте по своему усмотрению, не касаясь кода. Вы упоминаете случай с несколькими экземплярами ListCreator. Вам нужно будет сделать 3 изменения:

1) расчетное пространство:

<SValue id="ListCreator" type="[]">

2) дизайн (например):

<SValue id="ListCreator">
    <SValue id="1">
        <NValue id="SortDescending" value="true"/>
        <SValue id="TableWriter" value="Pdf"/>
    </SValue>
    <SValue id="2">
        <NValue id="SortDescending" value="false"/>
        <SValue id="TableWriter" value="Xls"/>
    </SValue>
</SValue>

3) Будьте готовы получить вместо этого массив (код):

ListCreator[] creators = config.getValue("ListCreator");

Вы определяете количество и альтернативы в дескрипторе; записи поступают в определенном порядке. Это работает аналогично для нескольких измерений (например, «[] [] []»). Вы можете добавить альтернативные средства записи таблиц с другими параметрами в будущем или изменить текущие параметры без изменений кода на стороне вызывающего. Просто убедитесь, что все классы доступны, и протестируйте это. Есть несколько источников ошибок (опечатки).

0 голосов
/ 28 июля 2011

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

protected void configure() {
  bind(TableWriter.class).to(PdfTableWriter.class);
}

@Provides
protected ListCreator provideListCreator(TableWriter tableWriter) {
  ModularListCreator result = new ModularListCreator();
  result.setTableWriter(tableWriter);
  result.setSortDescending(true);
  return result;
}

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

@Inject public void setSortDescending(
    @Named("sortDescending") boolean sortDescending)

, а затем привязывайте это свойство:

protected void configure() {
  bind(TableWriter.class).to(PdfTableWriter.class);
  bindConstant().annotatedWith(Names.named("sortDescending")).to(true);
  bind(ListCreator.class).to(ModularListCreator.class);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...