当前位置: 首页 > 知识库问答 >
问题:

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

暨正真
2023-03-14

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

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

共有2个答案

古刚洁
2023-03-14

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

我不知道如何使用bean。xml来注入ear/war本身之外的任何东西。

养聪
2023-03-14

您有三种解决方案:

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将在生成时注入这些bean类。

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

焊接参考文档中有一个很好的注入点示例。

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

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

 类似资料:
  • 基本上,我的项目是一场战争(MyProject),导入2罐,MyProject-Client和MyProjectJar-API 我的项目 MyProjectJar-API - 有一个接口 MyProject-Client -想要注入在MyProject上生成的ParametroService 我想知道是否可以将ParameterService(在MyProject上生成)注入MyProject客户

  • 我有一个JAR文件,其中包含一个请求范围Bean。(一个注释为的类)。 我有另一个Web服务项目(作为WAR文件构建)。上述JAR文件位于WAR文件的文件夹中。 我试图的类到Web服务项目中的一个类中。 我正在得到一个 这两个项目都有JAR文件,WAR文件包含一个空的。我已经研究这个问题好几天了。请帮忙。 谢谢

  • 我有一个JSF的问题,CDI项目。我做了大量研究,发现在CDI中没有注释。我用对话框解决基于ajax的页面的问题。我想将变量从DataTable传递到dialog。为此,我不能使用bean,因为在请求结束后会丢弃值。有人能帮我解决吗?我不能使用,但这是一个糟糕的做法。或者只保存这一个变量到会话谁知道。你们能给我一些提示如何优雅地解决这个问题吗? 以下是错误消息:

  • 问题内容: 我试图将在Spring上下文中定义的bean注入到CDI托管组件中,但没有成功。不会注入Bean,而是在每次执行注入时都会创建一个新实例。我的环境是带有JBoss Weld的Tomcat 7。 Spring ApplicationContext很简单: CDI托管bean如下所示: 这是我的 但是,当我从JSF页面访问属性时,每次访问时都会创建一个新实例。这是一个简单的示例: 我得到以

  • CDI到达以执行类的构造函数。但是,请求字段未初始化(注入)。 我做错了什么?

  • CDI bean: 当我现在访问无状态EJB(例如从servlet访问)时,我希望testMethod使用与调用方的HttpSession相关联的CDI bean。因此,如果来自不同Browser/HTTP会话的两个客户机访问Servlet,它们都将得到不同的结果字符串。 我是否需要CDI而不是?如果需要,我如何为给定会话生成正确的bean实例?我想过也许可以使用BeanManager并搜索Ses