Java配置和依赖注入(类似于Springs IoC与Weld/Guice)

Java配置和依赖注入(类似于Springs IoC与Weld/Guice),java,spring,configuration,dependency-injection,jboss-weld,Java,Spring,Configuration,Dependency Injection,Jboss Weld,假设我有一个要配置的类ListCreator。我希望能够告诉它排序顺序以及如何输出我的表。因此,我有布尔sortDescending属性和TableWriter接口,该接口由PdfTableWriter实现(也由xlstablewiter实现)。 在这个例子中,我认为配置和DI是齐头并进的。我想写一些类似于Spring(伪)的例子: 真的 现在Spring可以做到这一点,但Weld&Guice似乎不行。例如,Weld允许您在beans.xml中选择备选方案,但仅适用于整个应用程序。如果我想同

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


真的
现在Spring可以做到这一点,但Weld&Guice似乎不行。例如,Weld允许您在beans.xml中选择备选方案,但仅适用于整个应用程序。如果我想同时为PDF和XLS提供一个
ListCreator
,该怎么办

我目前还不了解Weld和Guice的范围,因为它们似乎不允许太多的配置。这似乎只是减轻了编写
新的
或实现自己工厂的需要。EJB注入也做了同样的事情,例如,这很好,但是整个配置部分在哪里(用我实际想要的参数选择哪个实例)


说到真正的问题:我确实不想使用Spring,因为它似乎是开销。我更愿意使用JSR指定的干净、小的东西。有什么建议吗?

Guice实际上为您提供了大量的配置功能。假设我对您的理解正确,下面是一个简单的示例,展示了在Guice中使用模块中的provider方法来实现这一点的一种方法

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;
}
还有其他方法,包括使用绑定注释:

@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);
}

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

为您提供了一种灵活的基于描述的解决方案。我创建了整个示例,并将其添加到

代码是最小的,包括:

Design config = new Design("config.xml");
ListCreator creator = config.getValue("ListCreator");
假设您有一个config.xml输入设计,其中包含输入语法中的设置:

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

@samy delux:如果您构建代码以部署更改,这不是问题。您是否经常在没有新构建的情况下更改已部署实例的XML?不管怎么说,不需要编译就可以提取出想要重新配置的内容,这相对比较容易。例如,您可以将“sortDescending=true”放在属性文件中,并使用Names.bindProperties从文件中绑定该属性。虽然在更改内部行为(切换类的实现)时重建项目是合理的,但我仍然认为Spring在配置文件中执行此操作的方式要干净得多。例如,我将如何配置多个
ListCreator
s的属性?那个属性文件会变得乱七八糟。除了春天没有别的吗?
<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>
<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"/>
<SValue id="ListCreator" type="[]">
<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>
ListCreator[] creators = config.getValue("ListCreator");