繁体   English   中英

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

[英]CDI: Injecting resources to beans from external libraries

在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。

Weld参考文档中,您有一个不错的InjectionPoint示例。

开发扩展

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

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

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

Pure CDI提供了@Alternative批注,以便在测试阶段通过beans.xml注入例如模拟对象,但是许多模拟库由于为它们而设计,因此效果更好。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM