CDI:从外部库向 bean 注入资源



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

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

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

使用创建者

CDI 提供了一种在 bean 中转换非 CDI 类的方法。它被称为生产者。如果你想从一个名为 NonCdiClass 的类创建一个 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 注入。

生产者还可以使用限定符(在它们或其参数上(或注入 InjectionPoint,这是一个 CDI 内部 bean,允许您以不同的方式生成您的 bean,以不同的方式生成您的 bean,功能在注入的位置和它具有什么注释。

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

开发扩展

我不会在这里详细介绍,因为我不知道这是否是您的需求,但是您可以在 AfterBeanValidation 阶段在扩展中注册 bean。这些注册的 bean 可以是您想要的任何类别。如果您需要更多信息,我可以在这里开发。

使用接缝焊料(旧版(或等待 Deltaspike 0.6

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

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

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

最新更新