【问题标题】:CDI, how to substitute an injected bean with anotherCDI,如何用另一个替换注入的bean
【发布时间】:2019-12-11 22:40:35
【问题描述】:

我最近开始在我工作的一个项目中使用 CDI,但我遇到了一种特定情况,我还没有找到解决方案。有人可以给我一些提示吗?我真的很感激。

我有一个使用自定义框架的应用程序。

  1. 在自定义框架中,我有一个注入 bean 的 ejb。

    public class MyEjb implements MyEjbBI {
        ...
        private IServiceHolder serviceHolder;
        ...
    }
    
    public interface IServiceHolder {
        ...
    }
    
    public class DefaultServiceHolder implements IServiceHolder {
        ...
    }
    
  2. 在我的应用程序中,上述代码被打包到一个 jar 文件中,并且该 jar 还包含一个我无法更改的 bean.xml 文件,因此我无法在自己的实现中使用 @Alternative

    public class MyServiceHolder extends IServiceHolder
    {
        ...
    }
    

我的问题:是否有可能在运行时将“MyEjb”(默认)注入的 serviceHolder 替换为“MyServiceHolder”实现?

我提到我也可以在框架代码中进行更改。 我已经阅读了一些关于生产者方法的内容,但我并不真正了解如何使用它们。

谢谢!

【问题讨论】:

    标签: cdi


    【解决方案1】:

    @Alternative 应该可以,但是您需要 @Priority 来声明您的实现是应用程序的选定替代方案:

    @Alternative @Priority(Interceptor.Priority.APPLICATION)
    public class MyServiceHolder implements IServiceHolder {
       ...
    }
    

    CDI 规范说:

    5.1 模块化
    替代方法不可用于注入、查找或 EL 解析到模块中的类或 JSP/JSF 页面,除非该模块是 bean 存档并且为 bean 存档或应用程序明确选择了替代方法。

    5.1.4 模块间注入
    如果满足以下条件,则 bean 可用于在某个模块中注入:

    • bean 不是拦截器或装饰器
    • bean 已启用,
    • bean 不是替代品,或者模块是 bean 存档并且 bean 是 bean 存档的选定替代品,或者 bean 是 应用程序的选定替代品,并且
    • 根据模块架构的类可访问性要求,模块中的类必须可以访问 bean 类。

    你甚至不需要在 你自己的 beans.xml 中声明你的 CDI 作为替代:

    <?xml version="1.0" encoding="UTF-8" ?> 
    <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                               http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" 
           bean-discovery-mode="all">
        <!--Using @Priority you dont need to specify alternative here-->
    </beans>
    

    【讨论】:

      猜你喜欢
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 2014-06-02
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 2021-12-05
      相关资源
      最近更新 更多