我有一个带有@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会多久创建一次?我怀疑每次访问都正确吗?是否有关于此的文档?
根据CDI(1.2)规范
当没有通过注释bean类来显式声明范围时,或者生产者方法或字段的范围默认为bean。
未明确声明范围的Bean的默认范围取决于其声明的构造型:
•如果Bean没有使用已声明的默认值声明任何构造型作用域,bean的默认作用域是@Dependent。
•如果bean声明的所有构造型都声明了默认范围具有相同的默认范围,则该范围是Bean的默认范围。
•如果bean声明了两种不同的构造型,声明不同的默认范围,则没有默认范围,并且Bean必须显式声明一个作用域。如果没有明确声明作用域,容器将自动检测到问题并将其视为定义错误。
如果bean显式声明一个作用域,则任何由刻板印象将被忽略。
您可以从此处public class AppleProducer {
@Produces
public Apple createApple() {
return new Apple();
}
}
下载规范
由于您没有定义任何作用域,因此,您产生的bean将由defaut http://www.cdi-spec.org/download/。
这意味着生产的bean的生命周期将是注入它的bean的生命周期。
因此,如果您有以下生产者:
@Dependent
如果将苹果注入public class AppleProducer {
@Produces
public Apple createApple() {
return new Apple();
}
}
@ApplicationScoped
Bean中:
Pie
然后@ApplicationScoped
public class Pie {
@Inject
private Apple apple;
}
bean将是Apple
,因此只创建了一次。
如果@ApplicationScoped
bean是Pie
,则将在每个请求处创建@RequestScoped
bean。