有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java CDI生成运行时创建的实例

我对cdi producer模式还不熟悉,到目前为止,我已经看到了一些示例,它们生成了在类的初始化点已知的简单内容。现在我必须生成一个在运行时创建的实例,并填充一些在运行时也会发生的数据。这是我目前的做法,但对我来说并不是那么好。。。有没有更好的方法,请帮我介绍一些模式和实践

 public class myBean {
 private DataHolder dataHolder;

  @Produces
  public DataHolder {
   // dataHolder is null until I later init instance 
   return dataHolder;
  }
}

在我的代码中的某个时刻,我将dataHolder设置为new istance,并通过以下操作允许进一步的注入使用运行时数据:

dataHolder = new DataHolder(data1, data2, data3);

这看起来有点傻:)有更好的办法吗?还是制作cdi的好模式


共 (2) 个答案

  1. # 1 楼答案

    一种方法是:

    @Produces
    @RequestScoped
    public Coder getCoder(@New DataHolder dataHolder) 
    {
       return dataHolder;      
    }
    

    另一种方法是使用你得到的信息作为生产者方法的信息,例如注入点或你进入它的其他信息

    @Produces
    @RequestScoped
    public Coder getCoder(@New DataHolder dataHolder, InjectionPoint injectionPoint, ClassA a, ClassB b) 
    {
       String stringA = a.function();
       dataHolder.someFunction(stringA);
       return dataHolder;      
    }
    

    我用最后一种方法创建了我的设备,它包含了我所需要的一切,并且不需要做任何其他事情。 有关这方面的一些资源,请访问 byteslounge.comJboss docs

    编辑:我很难找到这些信息,但CDI制作人的工作方式是,您声明为参数的所有内容(例如:getCoder)都将在调用时注入。因此,您可以注入服务,帮助您在运行时收集信息

  2. # 2 楼答案

    您的方法确实很笨拙,因为如果在初始化之前的任何时候有DataHolder注入,它将返回null(如果生成@Dependent对象),甚至崩溃(使用任何其他作用域)

    我建议你阅读一下CDI specWeld doc中的生产者方法

    现在,我对这件事的看法。最干净的方法是让制作人的主体每次都做所有的创作工作。这意味着:

    1. 向producer方法添加参数(注意:它们必须是可注射的bean)
    2. 拥有在MyBean类中创建DataHolder所需的参数,并从创建开始读取这些参数(生产者必须随时可以使用这些参数)
    3. 将检索这些参数所需的逻辑放入producer方法

    如果你坚持返回@Dependentbean,你的制作人可以返回null——如果你愿意,你可以利用它。然后,注入点可以预期一个可能的空值,该值可以解释为“尚未初始化”。或者,如果您需要不同的作用域(@ApplicationScoped@RequestScoped,…)然后,可能更容易创建第二个DataHolder的虚拟实现,这同样意味着“尚未实现”

    旁注:任何在CDI中手动创建的对象(例如使用new)都不会自动解析其注入点。这意味着,如果您在使用new创建DataHolder本身的同时,向^{DataHolder中注入任何,就会有null