Java 如何通过CDI实现命令模式?
我是CDI的新手,有点困惑。我有以下问题。我们有集体诉讼。我们有一个包装类,它将所有动作对象保存在hashmap中。像这样的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
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。也就是说,我们只是在包中创建类,仅此而已。