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

时间:2013-07-24 07:14:20

标签: java dependency-injection cdi

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

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

2 个答案:

答案 0 :(得分:4)

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

使用制作人

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 reference documentation中有一个很好的InjectionPoint示例。

制定扩展

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

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

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

答案 1 :(得分:1)

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

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