1

在 Spring 中,我们有基于注解和基于 XML 的配置。虽然第一个建议用于快速开发,但第二个更灵活并且能够处理特殊情况。我们目前有 2 个:为 JUnit 测试注入模拟和从外部库配置 bean。

我还没有找到 CDI 的 XML 配置的任何等效项,所以我的问题是,如何处理此类 bean 的依赖注入?它们来自外部库,需要对其进行配置,并且不可能向它们添加任何注释。

4

2 回答 2

4

您有三种解决方案来满足您的需求:

使用生产者

CDI 提供了一种在 bean 中转换非 CDI 类的方法。它被称为生产者。如果你想从一个名为NonCdiClassYou 的类创建一个 bean,你只需要创建类似的东西

public class MyProducers {
    @Produces
    public NonCdiClass produceNonCdiClass() {
        return new NonCdiClass();
        };
    }
  }

您现在可以@Inject在需要时使用此 bean。

您可以在课堂上放置任意数量的生产者方法。

如果您需要在生产的 bean 中模拟注入,则可以通过 CDI 在生产者方法调用中注入参数来实现。

@Produces
public NonCdiClass produceNonCdiClass(MyFisrtBean param1, MySecondBean param2) {
    NonCdiClass res = new NonCdiClass(param1);
    res.setParam(param2);
    return res;
    };
}

在此示例中MyFirstBeanMySecondBean是现有的 bean 类,将由 CDI 在生产时注入。

生产者还可以具有限定符(在它们上或在它们的参数上)或注入InjectionPointCDI 内部 bean,允许您根据注入的位置和注解的功能以不同的方式生产 bean。

Weld 参考文档中有一个很好的InjectionPoint示例。

开发扩展

因为不知道是不是你的需要,这里就不赘述了,但是你可以在 AfterBeanValidation 阶段的扩展中注册 bean。这些注册的 bean 可以是任何你想要的类。如果您需要更多信息,我可以在这里开发。

使用 Seam Solder(旧版)或等待 Deltaspike 0.6

Solder 集成了一个配置模块,但该项目不再维护,因为它正在合并到Apache Deltaspike中。此合并位于 Deltaspike 0.6 版路线图中:http: //issues.apache.org/jira/browse/DELTASPIKE-271。因此,您可以开始使用 Solder 配置并在具有该功能时切换到 Deltaspike(应该非常接近)。这个解决方案不是我最喜欢的,但如果你真的想要一个配置文件 à la Spring,它是最接近的解决方案

于 2013-07-24T10:00:15.127 回答
1

纯 CDI 提供@Alternative注解以在测试阶段通过 注入例如模拟对象beans.xml,但许多模拟库做得更好,因为它们是为它设计的。

我不知道有一种方法可以beans.xml在耳朵/战争本身之外注入任何东西。

于 2013-07-24T07:40:53.327 回答