您在CDI中使用生产者方法的类使用什么范围?

Pet*_*sik 2 java java-ee cdi

假设我有一个仅产生一些bean,列表,项目等的类

public class MightyProducer {

    @Produces
    public Bean1 someBean() {
         //some init
         return new Bean1();
    }

    @Produces
    @CoolItems
    public List<Items> items() {
        //some init
        return new ArrayList<Item>();
    }

}
Run Code Online (Sandbox Code Playgroud)

这样的课程应该有什么范围?我应该留给它@Dependent还是最好的方法?我读过CDISingleton对此有好处的地方,但我真的不知道为什么。

Hei*_*löd 9

这个线程是我在该主题上唯一能找到的线程。由于我没有找到完全令人满意的答案,因此我进行了一个小实验,在该实验中,我一次声明了包含@Produces带有@ApplicationScoped注释的方法的类,而一次没有该方法的类。我在私有构造函数中跟踪了生产者类实例的构造。

我发现在使用注释生产者类的情况下@ApplicationScoped,仅创建了一个实例,这是显而易见的。但是没有注释,每当@Produces调用该方法时都会创建一个新实例,这是由于创建了注入的生产类型的bean实例所致。

因此,使生产者类@ApplicationScoped减少(不需要)对象创建可能有一点意义。但是由于对象创建如今被认为是如此便宜,因此仅当生产者类至少具有一些要初始化的状态时,这才可能相关。