Java CDI注入非零参数构造函数

Java CDI注入非零参数构造函数,java,cdi,Java,Cdi,我正在使用java标准CDI,有一个概念我无法理解。在下面的示例中,应用程序类“需要”Person类,该类不能被注入,因为它具有非零args构造函数。我应该如何使用CDI处理这种情况 @Default class Person { private String name; Person(String name) { this.name=name; } String getName() { return this.name; } } class Application {

我正在使用java标准CDI,有一个概念我无法理解。在下面的示例中,应用程序类“需要”Person类,该类不能被注入,因为它具有非零args构造函数。我应该如何使用CDI处理这种情况

@Default
class Person {
 private String name;
 Person(String name) {
  this.name=name;
 }
 String getName() {
  return this.name;
 }
}


class Application {
  @Inject
  public Application(Instance<Person> p)
}
@默认值
班主任{
私有字符串名称;
Person(字符串名称){
this.name=name;
}
字符串getName(){
返回此.name;
}
}
班级申请{
@注入
公共应用程序(实例p)
}

有三种方法可以在没有参数构造函数的情况下注入对象。一种是使用生产者来创建对象

@Produces 
private Person producePerson() {
    return new Person(name);
}
第二个是用@Inject注释其中一个构造函数,并确保所有参数都是有效的注入目标

class Person {
    private String name;

    @Inject
    Person(String name) {
        this.name=name;
    }

    String getName() {
        return this.name;
    }
}
在其他地方:

@Produces 
private String producePersonName() {
    return name;
}
(设置多个此类注入可能需要创建一些限定符注释)


第三种方法是使用自定义扩展来处理CDI容器初始化,但对于这样一个相对简单的需求来说,这是过分的。

请解释您的实际问题。另外,CDI应该如何使用非零参数构造函数创建对象,它应该在哪里使用构造函数应该调用的值?实际上,这是我的问题..我该如何做上述工作。这在CDI中是不可能的吗?如果您使用的是实例,似乎您想要创建多个人,那么CDI如何知道每个人的姓名?您应该有一个默认构造函数和一个名称设置器。(如果您真的需要注入一个域实体,例如person,但这是另一个问题。)奇怪的是,文档实际上展示了如何:当您通过
new
创建对象并返回它时,可以使用
@products
方法。尽管是手动创建的,
@products
将使其由CDI容器管理。