Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.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实现命令模式?_Java_Jakarta Ee_Design Patterns_Dependency Injection - Fatal编程技术网

Java 如何通过CDI实现命令模式?

Java 如何通过CDI实现命令模式?,java,jakarta-ee,design-patterns,dependency-injection,Java,Jakarta Ee,Design Patterns,Dependency Injection,我是CDI的新手,有点困惑。我有以下问题。我们有集体诉讼。我们有一个包装类,它将所有动作对象保存在hashmap中。像这样的 class TestAction implements Action{ @EJB private MyBean bean; public void doSomething(){ //here we do something with injected EJB } } class Foo { private HashMap<Strin

我是CDI的新手,有点困惑。我有以下问题。我们有集体诉讼。我们有一个包装类,它将所有动作对象保存在hashmap中。像这样的

class TestAction implements Action{
  @EJB
  private MyBean bean; 
  public void doSomething(){
    //here we do something with injected EJB
  }
}

class Foo {
   private HashMap<String, Action> hm;
   public void execute (String action){
   this.hm.get(action).doSomething();    
 }    
}
类TestAction实现操作{
@EJB
私家蚕豆;
公共无效剂量测定法(){
//这里我们用注入的EJB做一些事情
}
}
福班{
私有HashMap-hm;
公共void执行(字符串操作){
this.hm.get(action.doSomething();
}    
}
当我不使用CDI时,一切都正常。但我需要使用它。所以,据我所知,我必须通过cdi容器创建所有操作,否则cdi容器无法将托管bean注入其中。那么我的问题是,通过CDI实现命令模式的最佳方式是什么

编辑: 我阅读了Dhanji R.Prasanna的依赖注入、焊接参考(WR)、JavaEE7教程(CDI部分)——不建议阅读最后一篇。经过一点思考,我明白了我需要注入HashMap。此外,我明白我必须使用生产者方法。好啊我说。我终于明白了。因此,我编写了以下生产者方法:

@ApplicationScoped
public class ActionMapFactory {
    @Produces @Preffered
    public HashMap<String, Action> getHashMap(){
    HashMap<String, Action> hm=new HashMap<>();
     if (...){
     hm.put("save",new SaveAction());
     }
     return hm;
    }
}
@ApplicationScoped
public class ActionMapFactory {

    @Inject
    private SaveAction saveAction;

    @Inject
    private DeleteAction deleteAction;

    // And so on

    @Produces @Preffered
    public HashMap<String, Action> getHashMap() {
        Map<String, Action> hm = new HashMap<>();
        hm.put("save", saveAction);
        hm.put("delete", deleteAction);
        return hm;
    }
}
@ApplicationScoped
公共类ActionMapFactory{
@生成@prefered
公共HashMap getHashMap(){
HashMap hm=新的HashMap();
如果(…){
hm.put(“保存”,新的SaveAction());
}
返回hm;
}
}
从西铁:

上面的代码有一个潜在的问题。实现 使用Java新操作符实例化的。物体 由应用程序直接实例化,不能利用 依赖注入,并且没有拦截器


我已经阅读了WR的解决方案,但是如果我有几十个动作和很多Foo子类,我该怎么办?

您可以通过将所有动作注入
ActionMapFactory
并在producer方法中填充
HashMap
来避免
new

@ApplicationScoped
public class ActionMapFactory {
    @Produces @Preffered
    public HashMap<String, Action> getHashMap(){
    HashMap<String, Action> hm=new HashMap<>();
     if (...){
     hm.put("save",new SaveAction());
     }
     return hm;
    }
}
@ApplicationScoped
public class ActionMapFactory {

    @Inject
    private SaveAction saveAction;

    @Inject
    private DeleteAction deleteAction;

    // And so on

    @Produces @Preffered
    public HashMap<String, Action> getHashMap() {
        Map<String, Action> hm = new HashMap<>();
        hm.put("save", saveAction);
        hm.put("delete", deleteAction);
        return hm;
    }
}

实际上我现在做的是构造函数注入。但是,手动编写所有操作不是很好。使用命令模式,我们可以自动创建actionMap。也就是说,我们只是在包中创建类,仅此而已。