带有@Produces注释但无范围的方法的行为

Har*_*own 6 java ejb java-ee cdi

我有一个带@Produces注释的方法可以创建一个Apple.

当我@ApplicationScoped像这样使用它

public class AppleProducer {
    @ApplicationScoped
    @Produces
    public Apple createApple() {
        return new Apple();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后Apple只为整个应用程序创建一次.

当我@RequestScoped像这样使用它

public class AppleProducer {
    @RequestScoped
    @Produces
    public Apple createApple() {
        return new Apple();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后它会为每个请求创建.

但是,如果我没有指定范围怎么办?

public class AppleProducer {
    @Produces
    public Apple createApple() {
        return new Apple();
    }
}
Run Code Online (Sandbox Code Playgroud)

Apple会多久创建一次?我怀疑每次访问,是否正确?有关于此的文件吗?

Sve*_*rev 8

来自CDI(1.2)规范

当通过注释bean类或生成器方法或字段没有显式声明作用域时,bean的作用域是默认的.

未明确声明范围的bean的默认范围取决于其声明的构造型:

•如果bean没有声明任何具有声明的默认范围的构造型,则bean的默认范围是@Dependent.

•如果bean声明的具有某些声明的默认作用域的所有构造型具有相同的默认作用域,则该作用域是该bean的默认作用域.

•如果bean声明了两个不同的构造型声明了不同的默认作用域,则没有默认作用域,并且bean必须显式声明作用域.如果它没有显式声明范围,容器会自动检测问题并将其视为定义错误.

如果bean显式声明了作用域,则忽略由构造型声明的任何默认作用域.

您可以从这里下载规范http://www.cdi-spec.org/download/


Rou*_*boy 5

由于您没有定义任何范围,因此您生成的 bean 将@Dependent默认为。

这意味着生成的 bean 的生命周期将是它被注入的 bean 的生命周期(包含 )@Inject

因此,如果您有以下生产者:

public class AppleProducer {
    @Produces
    public Apple createApple() {
        return new Apple();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果将苹果注入@ApplicationScoped PieBean 中:

@ApplicationScoped
public class Pie {

    @Inject
    private Apple apple;
}
Run Code Online (Sandbox Code Playgroud)

然后这个Applebean就会被@ApplicationScoped创建一次。

如果Piebean 是,则将在每次请求时创建@RequestScoped该bean。Apple