Java ee 接口(interface)条件注入(inject)

标签 java jakarta-ee ejb-3.0 wildfly-8

我有以下界面:

public interface ResultEvaluationInterface {
    public void evaluateResults(Event e);
}

并且我想根据我的 Event.type 不同的类在我的类中注入(inject)相同的实现。类似的东西:

@Stateless
@LocalBean    
public class ResultEvaluation implements ResultEvaluationInterface {

    @Override
    public void evaluateResults(Event e) {
        switch (e.getType()) {
            case Type.Running:
               // inject and call ResultEvaluationRunningEJB.evaluateResults(e)
            case Type.Swimming:
               // inject and call ResultEvaluationSwimmingEJB.evaluateResults(e)
            default:
               throw new UnsupportedOperationException("Not supported yet.");
        }
    }

}

ResultEvaluationRunningEJBResultEvaluationSwimmingEJB 都实现了该接口(interface)。有人知道如何以好的方式做到这一点吗?

最佳答案

如果您真的想使用硬编码的 if 语句在生产事件和开发事件之间切换,您可以使用 CDI 限定符,只需将这两个实现注入(inject) Facade 即可:

@Stateless
@LocalBean    
public class ResultEvaluationFacade {

    @Inject
    @Development
    private ResultEvalutationInterface dev;

    @Inject
    @Production
    private ResultEvalutionInterface prod;

    @Override
    public void evaluateResults(Event e) {
        switch (e.getType()) {
            case Type.Production:
               prod.evaluteResult(e);
               break;
            case Type.Development:
               dev.evaluteResult(e);
               break;
            default:
               throw new UnsupportedOperationException("Not supported yet.");
        }
    }

}

并定义你的两个实现:

@Development
public class ResultEvaluationDevelopment implements ResultEvaluationInterface {
   ...
}

@Production
public class ResultEvaluationDevelopment implements ResultEvaluationInterface {
   ...
}

不过,我会考虑使用模拟 Maven 项目来容纳这两个独立的实现。

或者,您可以使用不同的 CDI 事件类型,如下所示。

public void observeDevEvent(@Observe DevEvent event) {
   //do stuff.
}

public void observeProdEvent(@Observe ProdEvent event) {
   //do stuff
}

触发事件看起来像这样:

@Inject
private Event<ProdEvent> prodEvent;

public void someMethod() {
   ProdEvent pe = new ProdEvent()
   // set some data on ProdEvent
   prodEvent.fire(pe);
}

注意事件也可以与限定符一起使用,因此您还可以向事件添加限定符注释,而不是实现两种不同类型的事件。

@Inject
@Production
private Event<MyEvent> event;

并监听@Prodcution 事件;

public void handleProdEvent(@Observer @Production MyEvent myEvent) {
    // do Stuff.
}

对于 bean 的惰性实例化,您可以使用 CDI 实例注入(inject)。

@Inject
private Instance<BeanA> beanA;

....

public void doStuff(Event e) {
   ...
   case Type.Production:
            //lazily evaluates and instantiatiates bean.
            beanA.get().evaluateResult(e);
}

关于Java ee 接口(interface)条件注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31474570/

相关文章:

java - 为每个 Activity 创建自定义操作栏

java - 使用 JSoup 连接到 Iframe

java - 什么是 EJB 客户端?

testing - 为什么要在嵌入式容器中测试 ejb3?

java - 构建单独的类(规范化?)

java - 如何使用 JPA 和 Hibernate 返回一个 Map,其中键是实体属性,值是实体

java - hibernate "ON UPDATE CURRENT TIMESTAMP"列

jakarta-ee - 将 Jersey 2.1 与 CDI 一起使用

css - 如何更改 <rich :simpleTogglePanel> dependent on attribute opened? 的样式

sql - 通过 Ant 构建文件创建数据库(而不是填充它)