Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CDI:从外部库向bean注入资源_Java_Dependency Injection_Cdi - Fatal编程技术网

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

Java CDI:从外部库向bean注入资源,java,dependency-injection,cdi,Java,Dependency Injection,Cdi,在Spring中,我们有基于注释和基于XML的配置。虽然第一个建议用于快速开发,但第二个更灵活,能够处理特殊情况。我们目前有两种方法:为JUnit测试注入mock和从外部库配置bean 我还没有为CDI的XML配置找到任何等价物,所以我的问题是,如何处理这种bean的依赖注入?它们来自外部库,需要进行配置,不可能向它们添加任何注释 Pure CDI提供了@可选的注释,以便在测试阶段通过beans.xml注入例如模拟对象,但是许多模拟库做得更好,因为它们是为它而设计的 我不知道有什么方法可以使用b

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


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

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


我不知道有什么方法可以使用
beans.xml
来注入ear/war本身之外的任何东西。

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


我不知道如何使用
beans.xml
在ear/war本身之外注入任何东西。

您有三种解决方案:

使用制作人 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;
    };
}
在本例中,
MyFirstBean
MySecondBean
是现有的bean类,CDI将在生成时注入这些bean类

生产者也可以有限定符(在它们上面或在它们的参数上),或者注入
InjectionPoint
,这是一个CDI内部bean,允许您根据注入的位置和注释的不同来生成bean

在中有一个很好的
注入点
示例

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

使用接缝焊料(传统)或等待Deltaspike 0.6 焊料集成了一个项目,但该项目已不再维护,因为它已在合并过程中。此合并位于0.6版的Deltaspike路线图中:。因此,您可以开始使用焊料配置,并在Deltaspike具备该功能时切换到Deltaspike(应该非常接近)。
这个解决方案不是我最喜欢的,但如果你真的想拥有一个配置文件,它是最接近的解决方案

你有三个解决方案可以满足你的需要:

使用制作人 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;
    };
}
在本例中,
MyFirstBean
MySecondBean
是现有的bean类,CDI将在生成时注入这些bean类

生产者也可以有限定符(在它们上面或在它们的参数上),或者注入
InjectionPoint
,这是一个CDI内部bean,允许您根据注入的位置和注释的不同来生成bean

在中有一个很好的
注入点
示例

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

使用接缝焊料(传统)或等待Deltaspike 0.6 焊料集成了一个项目,但该项目已不再维护,因为它已在合并过程中。此合并位于0.6版的Deltaspike路线图中:。因此,您可以开始使用焊料配置,并在Deltaspike具备该功能时切换到Deltaspike(应该非常接近)。
这个解决方案不是我最喜欢的,但是如果你真的想要一个配置文件,它是最接近的解决方案

后一种情况(外部bean)听起来像是他们故意让它依赖于Spring。有这样的库的例子吗?@Kayaman数千个,几乎所有不是故意为CDI制作的东西,比如Velocity、GSON、CSVParser等等,所有需要任何配置和/或在其中设置其他类的类。这是不对的。虽然DI是一种方便的配置方式,但它不是唯一的方式。当然,如果你习惯于Spring,你可能不会意识到其他方法。@Kayaman好吧,我知道非IoC配置,这就是为什么我只想使用IoC。对我来说,一个巨大的创伤是单例疯狂模式,随后是管理复制到每个bean中的JDBC连接的代码:(因此,我可以接受的唯一替代方案应该是在单点中配置和生成类。您可以使用@PRODUCTS注释进行单点配置。然后@PRODUCTS将生成的项(无论它是什么)注入任何需要它的bean中。后一种情况(外部bean)听起来他们有意让它依赖于Spring。有关于这样的库的例子吗?@Kayaman成千上万的库,几乎所有的都是无意的