由@Produces方法创建的没有范围注释的bean的默认范围是什么?

问题描述 投票:6回答:2

我有一个带有@Produces批注的方法来创建一个@Produces

当我将其与Apple一起使用时

@ApplicationScoped

然后,整个应用程序只创建了一次Apple。

当我将其与public class AppleProducer { @ApplicationScoped @Produces public Apple createApple() { return new Apple(); } } 一起使用时

@RequestScoped

然后为每个请求创建它。

但是,如果我不指定范围呢?

public class AppleProducer {
    @RequestScoped
    @Produces
    public Apple createApple() {
        return new Apple();
    }
}

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

java java-ee ejb cdi
2个回答
8
投票

根据CDI(1.2)规范

当没有通过注释bean类来显式声明范围时,或者生产者方法或字段的范围默认为bean。

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

•如果Bean没有使用已声明的默认值声明任何构造型作用域,bean的默认作用域是@Dependent。

•如果bean声明的所有构造型都声明了默认范围具有相同的默认范围,则该范围是Bean的默认范围。

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

如果bean显式声明一个作用域,则任何由刻板印象将被忽略。

您可以从此处public class AppleProducer { @Produces public Apple createApple() { return new Apple(); } } 下载规范


3
投票

由于您没有定义任何作用域,因此,您产生的bean将由defaut http://www.cdi-spec.org/download/

这意味着生产的bean的生命周期将是注入它的bean的生命周期。

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

@Dependent

如果将苹果注入public class AppleProducer { @Produces public Apple createApple() { return new Apple(); } } @ApplicationScopedBean中:

Pie

然后@ApplicationScoped public class Pie { @Inject private Apple apple; } bean将是Apple,因此只创建了一次。

如果@ApplicationScoped bean是Pie,则将在每个请求处创建@RequestScoped bean。

© www.soinside.com 2019 - 2024. All rights reserved.