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