3

假设我有一个ListCreator要配置的类。我希望能够告诉它排序顺序以及如何输出我的表格。因此我有布尔sortDescending属性和由(但也由)TableWriter实现的接口。在这个例子中,我认为配置和 DI 齐头并进。我想写一些类似这个 Spring(伪)例子的东西:PdfTableWriterXlsTableWriter

<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 指定的干净和小巧的东西。有什么建议么?

4

3 回答 3

0

对于 CDI,请查看 Seam Solder。它增加了从 xml 文件轻松配置托管 Bean 的能力。从 Seam 和 Weld 团队之间的密切关系来看,这种机制很有可能成为未来的 JSR。

于 2012-02-26T18:04:06.030 回答
0

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);
}
于 2011-07-28T17:59:03.190 回答
0

如果您想要一个灵活的基于描述的解决方案,InPUT提供了一种方法。我创建了整个示例,并将其添加到示例部分

该代码是最小的:

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

假设您有一个 config.xml InPUT设计,其中包含 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");

您决定描述符中的数量和备选方案;条目按定义的顺序到达。这适用于多个维度(例如“[][][]”)。您可以在将来添加具有更多参数的替代表编写器,或者在调用方不更改代码的情况下更改当前参数。只需确保所有类都可用,并对其进行测试。有一些错误来源(错别字)。

于 2012-10-12T11:44:55.700 回答