【问题标题】:CDI Instance ProducerCDI 实例生产者
【发布时间】:2020-11-16 10:17:29
【问题描述】:
传递给我的生产者的实例确实代表有效的 bean?
@Qualif1
@Prodcues
B qualif1(@Any Instance<B> instances){
return instances.select(B1.class).get(); // Select instance of B1 which extends B
}
我想知道实例是否已经是 bean,或者只有选定的实例是容器管理的 bean?
提前致谢
【问题讨论】:
标签:
java
cdi
javabeans
java-ee-8
【解决方案1】:
这不取决于使用instances,而是取决于bean 的范围。对get 的调用与任何其他注入点一样工作:如果您get 是一个原型bean,则会创建一个新的bean 实例。如果你 get 是一个急切的单身人士 - 它在你调用 get 之前就已经创建好了。
您的问题似乎源于混淆了 bean 和 bean 的实例:前者是定义(并且在某种意义上都是由容器“管理”的),后者是实例(直接意义上的“托管”)。
抽象的阶梯是这样的:
类 -> bean -> 实例
所以“bean”既不是一个类(尽管在某些项目中每个 bean 也是一个类)也不是一个实例(尽管在某些项目中每个 bean 也是一个实例)。
就我个人而言,我责怪 Spring 模糊了三者之间的界限,鼓励在几乎所有事情上使用热切的单例。